Update:. After writing this answer, I figured out how to avoid using web.xml on Tomcat using the official Glassfish Jersey implementation. See here for more details.
If you are using a standard Tomcat installation (or some other servlet container), AFAIK you cannot explicitly prevent servlets from running in the web.xml
. Since you need to use web.xml
in any case, the easiest way to make serviced work services completely forget about the javax.ws.rs.core.Application
extension and just specify the context path. You can use standard jax-rs annotations to declare actual web services.
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" > <servlet> <servlet-name>rest-test</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.domain.mypackage</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name> rest-test</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
Two points worth noting:
You will need to link the REST implementation in your WAR file, as servlet containers usually do not contain. Since Jersey is the reference implementation of JAX-RS, this is the one I use in the servlet-class
element above. You can replace this with the Apache CXF implementation if you want.
The init-param
element tells Jersey which of your packages is looking for Java files with web service annotations. Edit this to point to your web services. Please note that if you decide to use apache CXF instead of Jersey, the material needed in any init-param
elements will be different. Someone who knows CXF, write what they will be.
If you are using Maven, just add the dependency to the jersey-servlet
in the dependencies
section of your pom.xml
file:
<dependencies> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-servlet</artifactId> <version>1.18.2</version> </dependency> ... </dependencies>
After that, your web services are advertised using standard JAX-RS annotations in your Java classes:
package com.domain.mypackage; import javax.ws.rs.Consumes; import javax.ws.rs.Produces; import javax.ws.rs.GET; import javax.ws.rs.MatrixParam; import javax.ws.rs.Path;
That should be all you need. If your Tomcat installation is performed locally on port 8080 and you deploy your WAR file to the myContext
context, go to
http:
... should produce the expected result (5).
Hooray!
* Someone please correct me if you know a way to add a Jersey servlet to a context in Tomcat without using web.xml
- perhaps using a context or a lifecycle listener?
source share