球衣2的HttpServletRequest字段可能不是静态的,最终的或注释类型错误

时间:2018-12-19 12:14:15

标签: java jersey jersey-2.0

我有以下用于REST调用的类。在我使用一切正常的运动衫1.13之前,现在我已经升级到运动衫2.27了,在给定类的任何其他调用上我都收到以下错误

  

警告[http-nio-8080-exec-4]   org.glassfish.jersey.internal.Errors.logErrors以下警告   已检测到:警告:HK2服务修复失败   [com.MyClass],但有一个例外:MultiException stack 1 of 2   java.lang.IllegalArgumentException:字段字段(HttpServletRequest   com..MyClass中的请求)可能不是静态的,最终的或具有   注释类型

     

2个java.lang.IllegalArgumentException中的MultiException堆栈2:错误   在对SystemDescriptor进行修正时被发现(     实施= com.MyClass合同= {com.MyClass}     scope = org.glassfish.jersey.process.internal.RequestScoped     限定符= {}说明符类型= CLASS说明符可见性=正常     元数据=等级= 0加载程序=空可代理=空     proxyForSameScope =无效analysisName =无效id = 150 locatorId = 0     identityHashCode = 1270899559 reified = false)

@Path("/myclass")
public MyClass{
@Context
    static
    HttpServletRequest request;

    @Context
    HttpServletResponse response;

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/method1")
    public Response method1(PostObj postObj) {
        //implementation
   }

}

如果我删除static关键字,则效果很好。但是我只希望请求保持静态。这里static关键字有什么问题?我该如何解决?

1 个答案:

答案 0 :(得分:2)

来自Java EE技术生态系统的JAX-RS API提供了注释@Context,以注入与HTTP请求的上下文有关的12个对象实例。它的行为就像分别在Java EE和Spring中的@Inject@Autowired注释一样。

它可以注入的对象实例如下:

  • SecurityContext –当前HTTP请求的安全上下文实例
  • Request –用于设置前提条件请求处理
  • ApplicationConfiguration和提供者-提供对JAX-RS的访问 应用程序,配置和提供程序实例
  • ResourceContext –资源上下文类实例
  • ServletConfig – ServletConfig实例实例
  • ServletContext – ServletContext实例
  • HttpServletRequest –当前请求的HttpServletRequest实例
  • HttpServletResponse –当前请求的HttpServletResponse实例
  • HttpHeaders –维护HTTP标头键和值
  • UriInfo –从称为URI的URI中查询参数和路径变量

这是注入实例字段的示例:

@Path("/")
public class EndpointResource {
    @Context
    private HttpHeaders httpHeaders;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getHeaders(){
        // Code here that uses httpHeaders
    }
}

请阅读有关注入的内容,这是为什么您不能注入静态字段的原因。避免对静态字段和方法进行依赖注入是一种很好的做法,因为它具有以下限制,并且很难调试。

  1. 通过DI创建类的第一个对象后,将注入静态字段,这意味着无法访问构造函数中的静态字段
  2. 静态字段不能标记为final,否则编译器或应用程序会在运行时抱怨它们
  3. 创建类的第一个实例后,静态方法仅被调用一次