Jersey-动态拾取资源方法
我想基于某些注释在Jersey中动态调用资源方法。例如,如果我在不同的包中有两个相同的资源,并且具有类似的资源方法,例如Jersey-动态拾取资源方法,jersey,Jersey,我想基于某些注释在Jersey中动态调用资源方法。例如,如果我在不同的包中有两个相同的资源,并且具有类似的资源方法,例如 package com.mycompany.controller.v1; @Component(value = "UsersControllerv1") @Path("/users") public class UsersController { @GET @Version("v1") @Produces({MediaType.APPLICATIO
package com.mycompany.controller.v1;
@Component(value = "UsersControllerv1")
@Path("/users")
public class UsersController {
@GET
@Version("v1")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response getUsers() {
}
}
package com.mycompany.controller.v2;
@Component(value = "UsersControllerv2")
@Path("/users")
public class UsersController {
@GET
@Version("v2")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response getUsers() {
}
}
其中@Version是一个自定义注释,用于指定api的版本。我是否可以截获一个请求(可能使用ResourceFilterFactory),该请求将一个版本指定为头参数,并使用匹配的版本调用特定的资源方法 如果尝试此操作,我在启动时会出现以下错误
12-Sep-2012 14:36:00 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 /users for root resource class com.mycompany.controller.v2.UsersController and the URI template /users transform to the same regular expression /users(/.*)?
12-Sep-2012 14:36:00 com.sun.jersey.spi.spring.container.servlet.SpringServlet initiate
SEVERE: Exception occurred when intialization
com.sun.jersey.spi.inject.Errors$ErrorMessagesException
at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136)
at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199)
at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:771)
at com.sun.jersey.spi.spring.container.servlet.SpringServlet.initiate(SpringServlet.java:117)
at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:318)
at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:609)
at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:210)
at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:373)
at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:719)
at org.eclipse.jetty.servlet.FilterHolder.doStart(FilterHolder.java:114)
我从未见过与jersey相关的版本注释的任何用法。我认为这是不可能的(如果可能的话,也许你有一个链接提供) URL模式必须是无歧义的(相互之间) 如果要提供同一资源的两个版本,则必须在URL中提供该版本 但是,您可以在查询中设置一个参数,但它实际上不是一个资源的两个不同版本,而是一个根据输入参数做出不同响应的版本 例如:
@POST
@Path("getUsers")
@Consumes(MediaType.TEXT_PLAIN)
@Produces(...)
public String getUsers(final String query){
....
允许您将任何需要的内容传递给资源。@Version是我将编写的自定义注释,将通过一些过滤器进行处理。更多的研究告诉我,我可以使用一个子资源定位器来实现我想要的-资源定位器将从请求中提取版本号,并使用匹配的版本注释定位正确的资源。好吧,我不知道你是否愿意深入泽西岛。然后,问题是如何克服jersey初始化时的检查(jersey根据URL模式检查是否能够将所有请求路由到正确的方法)