我使用Jersey和Tomcat7进行了restfull实现。我在campher.rest包中定义了3个名为RegionService,ClientService和NoteService的资源。
当我尝试添加另一个名为TestResource的资源并启动Tomcat时,它会在下面给出以下错误。我不明白/ {notes}如何与/ {test}冲突? 请帮忙,我的头发会谢谢你。
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
以下是这4项服务的骨架实现。
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 {
}
答案 0 :(得分:3)
@Path("test")
将匹配<web-root>/test
@Path("{test}")
将匹配<web-root>/foo
和<web-root>/bar
。这里的单词test只是用于关联foo
和bar
值的路径 - 参数映射键。
注意名称周围是否存在{}
。它们彻底改变了表达的含义。它们的存在表明您想要将其解压缩并将其放在用@PathParam("name-between-brackets")
注释的实例变量中。
您的@Path("{test}")
和@Path("{notes}")
两者基本上都要求泽西岛查找http://<host:port>/<webapp>/{capture-text}
表格的根网址,并将capture-text
复制到test
和{{ 1}}路径变量。这是不明确的。