我有以下用于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关键字有什么问题?我该如何解决?
答案 0 :(得分:2)
来自Java EE技术生态系统的JAX-RS API提供了注释@Context
,以注入与HTTP请求的上下文有关的12个对象实例。它的行为就像分别在Java EE和Spring中的@Inject
和@Autowired
注释一样。
它可以注入的对象实例如下:
SecurityContext
–当前HTTP请求的安全上下文实例Request
–用于设置前提条件请求处理Application
,Configuration
和提供者-提供对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
}
}
请阅读有关注入的内容,这是为什么您不能注入静态字段的原因。避免对静态字段和方法进行依赖注入是一种很好的做法,因为它具有以下限制,并且很难调试。