Jersey returns 404, after calling the correct @Path

This thing has puzzled me for quite some time. I am trying to embed a jersey container in Jetty. Following the examples, I can turn on Jersey and I see that my public REST method is being affected. however, for some strange reason, my Jersey does indeed return 404. It seems that Jersey is not able to resolve the correct endpoint. Unfortunately, this does not tell me why, but just throws a NotFoundException: - (.

I am 100% sure that my method is being called. System.out.println inside this method is displayed in the console, and my Eclipse debugger explicitly passes the set breakpoint. It doesnโ€™t matter if I use Jersey 2.0, 2.3, 2.4.1, 2.4. All have the same result. Here are the code snippets of my configuration:

StartJetty.java :

final int mainport = 9123; Server jettyServer = new Server(mainport); HandlerCollection handlerCollection = new ContextHandlerCollection(); jettyServer.setHandler(handlerCollection); ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/"); jerseyServlet.setInitOrder(1); jerseyServlet.setInitParameter("jersey.config.server.provider.packages", "com.test.rest"); handlerCollection.addHandler(context); jettyServer.start(); jettyServer.join(); 

Fragment from REST resource: com.test.rest.PersonsRSImpl.class:

 @Path("/persons") @Produces( MediaType.APPLICATION_JSON) public class PersonsRSImpl { private PersonManager personMgr = PersonManager.getInstance(); @Path("/list") public Collection<Person> list() { System.out.println("In Person::list" ); return personMgr.getPersons(); } } 

The My Person object is a simple POJO with some JAXB annotations. Adding / removing does not make any difference.

And last but not least: pom.xml http://maven.apache.org/maven-v4_0_0.xsd ">

  <modelVersion>4.0.0</modelVersion> <groupId>com.test</groupId> <artifactId>integrationexample</artifactId> <packaging>jar</packaging> <version>1.0.0-SNAPSHOT</version> <name>Test project</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.outputEncoding>UTF-8</project.build.outputEncoding> <jetty.version>7.5.4.v20111024</jetty.version> <jersey.version>2.4.1</jersey.version> </properties> <dependencies> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-servlet</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-http-spi</artifactId> <version>${jetty.version}</version> </dependency> <!-- Jersey JAX-RS --> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-simple-http</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-moxy</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.test.StartJetty</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> 

I turned on Jersey tracks (thanks Michal). Tracing the result:

Jersey track

 HTTP/1.1 404 Not Found X-Jersey-Tracing-000: START [ ---- / ---- ms | ---- %] baseUri=[http://localhost:9123/rest/] requestUri=[http://localhost:9123/rest/persons/list] method=[GET] authScheme=[n/a] accept=[text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8] accept-encoding=[gzip, deflate] accept-charset=n/a accept-language=[en-US,en;q=0.5] content-type=n/a content-length=n/a X-Jersey-Tracing-001: PRE-MATCH [ 0,01 / 1,03 ms | 0,10 %] PreMatchRequest summary: 0 filters X-Jersey-Tracing-002: MATCH [ ---- / 1,21 ms | ---- %] Matching path [/persons/list] X-Jersey-Tracing-003: MATCH [ ---- / 1,27 ms | ---- %] Pattern [/persons(/.*)?] IS selected X-Jersey-Tracing-004: MATCH [ ---- / 1,41 ms | ---- %] Matched resource: template=[/persons] regexp=[/persons(/.*)?] matches=[/persons] from=[/persons/list] X-Jersey-Tracing-005: MATCH [ ---- / 1,54 ms | ---- %] Matching path [/list] X-Jersey-Tracing-006: MATCH [ ---- / 1,58 ms | ---- %] Pattern [/list(/.*)?] IS selected X-Jersey-Tracing-007: MATCH [ ---- / 1,76 ms | ---- %] Matched resource: template=[/list] regexp=[/list(/.*)?] matches=[/list] from=[/list] X-Jersey-Tracing-008: MATCH [ ---- / 1,90 ms | ---- %] Matched locator : public java.util.Collection com.test.rest.PersonsRSImpl.list() X-Jersey-Tracing-009: MATCH [ ---- / 2,08 ms | ---- %] Resource instance: [com.test.rest.PersonsRSImpl @3cceafcb] X-Jersey-Tracing-010: MATCH [ ---- / 2,21 ms | ---- %] Resource instance: [java.util.HashMap$Values @25591d82] X-Jersey-Tracing-011: MATCH [ 4,23 / 5,30 ms | 75,92 %] RequestMatching summary X-Jersey-Tracing-012: RESP-FILTER [ 0,00 / 5,52 ms | 0,05 %] Response summary: 0 filters X-Jersey-Tracing-013: FINISHED [ ---- / 5,58 ms | ---- %] Response status: 404/CLIENT_ERROR|Not Found Cache-Control: must-revalidate,no-cache,no-store Content-Type: text/html;charset=ISO-8859-1 Content-Length: 1284 Server: Jetty(7.5.4.v20111024) 

Hopefully some of you have a clue on what's happening!

+7
java rest maven jersey jetty
source share
1 answer

You need to annotate your list() resource method with an annotation that indicates which HTTP method the resource method should respond to (in this case, @GET ):

 @GET @Path("/list") public Collection<Person> list() { System.out.println("In Person::list" ); return personMgr.getPersons(); } 

Otherwise, the resource method will be called, but it will be considered as a locator of sub-resources. For more information about sub-resources and sub-resource locators, see Sub-Resources .

+9
source share

All Articles