问题
I have a restfull implementation using Jersey and Tomcat7. I have 3 resources called RegionService, ClientService and NoteService defined in my campher.rest package.
When I try to add another resource called TestResource, and Tomcat starts, it gives me the following error below. I don't understand how /{notes} conflicts with /{test}?? Please help, my hair will thank you.
Aug 22, 2012 2:23:39 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
class campher.rest.NoteService
class campher.rest.ClientService
class campher.rest.TestResource
class campher.rest.RegionService
Aug 22, 2012 2:23:39 AM com.sun.jersey.api.core.ScanningResourceConfig init
INFO: No provider classes found.
Aug 22, 2012 2:23:40 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.12 02/15/2012 04:51 PM'
Aug 22, 2012 2:23:40 AM com.sun.jersey.spi.inject.Errors processErrorMessages
SEVERE: The following errors and warnings have been detected with resource and/or provider classes:
SEVERE: Conflicting URI templates. The URI template /{test} for root resource class campher.rest.TestResource and the URI template /{notes} transform to the same regular expression /([^/]+?)(/.*)?
Aug 22, 2012 2:23:40 AM org.apache.catalina.core.ApplicationContext log
SEVERE: StandardWrapper.Throwable
Here are the skeleton implementations of those 4 services.
package campher.rest;
@Path("regions")
public class RegionService {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response regions() {}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Region addRegion(Region region){}
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public Region updateRegion(Region region){}
@GET @Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getRegion(@PathParam("id") long id) {}
@DELETE @Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response deleteRegion(@PathParam("id") long id) {}
@GET @Path("{id}/clients")
@Produces(MediaType.APPLICATION_JSON)
public Response getClients(@PathParam("id") long id) {}
}
package campher.rest;
@Path("clients")
public class ClientService {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response clients() {}
@GET @Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getClient(@PathParam("id") long id) {}
@GET @Path("{id}/notes")
@Produces(MediaType.APPLICATION_JSON)
public Response getNotes(@PathParam("id") long id) {}
@GET @Path("{id}/alerts")
@Produces(MediaType.APPLICATION_JSON)
public Response getAlerts(@PathParam("id") long id) {}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Client addClient(Client client){}
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public Client updateClient(Client client){}
@DELETE @Path("{id}")
@Consumes(MediaType.APPLICATION_JSON)
public Response deleteClient(@PathParam("id") long id){}
}
package campher.rest;
@Path("{notes}")
public class NoteService {
@GET @Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getNote(@PathParam("id") long id) {}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Note addNote(Note note){}
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public Note updateNote(Note note){}
@DELETE @Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response deleteNote(@PathParam("id") long id) {}
}
package campher.rest;
import javax.ws.rs.Path;
@Path("{test}")
public class TestResource {
}
回答1:
@Path("test")
will match <web-root>/test
@Path("{test}")
will match <web-root>/foo
and <web-root>/bar
. The word test here is merely the path-param map key to associate foo
and bar
values.
Notice the presence and absence of {}
around the names. They completely change the meaning of the expression. Their presence indicates that you want to extract that out and put it in an instance variable annotated with @PathParam("name-between-brackets")
.
Your @Path("{test}")
and @Path("{notes}")
both are essentially asking Jersey to look for root URLs of the form http://<host:port>/<webapp>/{capture-text}
and copy the capture-text
into test
and notes
path variables respectively. This is ambiguous.
来源:https://stackoverflow.com/questions/12065001/getting-conflicting-uri-templates-errors-when-trying-to-add-resource-class