为什么我们不能在类(RCC)级别声明任何* Params Annotaion,同时在Jax-RS中同时声明@Singleton

时间:2017-10-07 18:30:41

标签: java jersey jax-rs

将根资源类作为@Singleton并在类级别同时声明@QueryParam注释时,

@Singleton
@Path("/")
public class MyResource{

    @QueryParam("q1") String q1;

    @Path("/test")
    public Response getQueryParam(){

        return Response.entity(q1).build;   
    }
}

我在请求时遇到500错误代码的异常,请帮助我如果有人知道此异常的原因。

SEVERE: StandardWrapper.Throwable
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) 

1 个答案:

答案 0 :(得分:1)

根据Example 3.24

中的docs
  在应用程序初始化期间,

将导致验证失败   单例资源无法注入请求特定参数。该   如果将注入查询参数,则相同的示例将失败   这种单例的构造函数参数。换句话说,如果你愿意的话   一个资源实例来服务更多请求(同时)   不能绑定到特定的请求参数。

由于QueryParam 特定于请求,您无法将其与@Singleton一起使用

@Context to the rescue!

好消息是你可以注入其他类型的对象,可以使用@Context注释注入,代理对象用于这些;因此允许用于单身人士:

@Context
private UriInfo urinfo;

private String queryparam;

@GET
@Produces(value = MediaType.APPLICATION_JSON)
public Response bla(){

    MultivaluedMap<String, String> params = urinfo.getQueryParameters(true);

    queryparam = params.containsKey("yourparam") ? 
                            params.get("yourparam").get(0) 
                            : "not in request";

    return Response.ok(queryparam).build();
}