0

特定のアノテーションに基づいて、Jersey でリソース メソッドを動的に呼び出したいと考えています。たとえば、このような同様のリソース メソッドを使用して、異なるパッケージに 2 つの同一のリソースがあるとします...

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)
4

1 に答える 1

0

ジャージに関連するバージョン アノテーションの使用は見たことがありません。私はこれが可能だとは思わない (提供するリンクがある場合)。

URL パターンは (相互に) あいまいではない必要があります。

同じリソースの 2 つのバージョンを提供する場合は、URL でバージョンを提供する必要があります。

ただし、クエリでパラメーターを設定することはできますが、実際にはリソースの 2 つの異なるバージョンではなく、入力パラメーターに従って異なる応答をする 1 つのバージョンになります。

例えば ​​:

@POST
  @Path("getUsers")
    @Consumes(MediaType.TEXT_PLAIN)
    @Produces(...)
    public String getUsers(final String query){
....

リソースに必要なものを何でも渡すことができます。

于 2012-09-12T15:28:19.987 に答える