gpt4 book ai didi

java - HttpServletRequest 字段可能不是静态的、最终的或有 Jersey 2 的注释类型错误

转载 作者:行者123 更新时间:2023-11-30 01:57:36 26 4
gpt4 key购买 nike

我有以下用于 REST 调用的类(class)。在我使用 jersey 1.13 之前,一切都工作正常,现在我已经升级到 jersey 2.27,在对给定类的任何休息调用上都会出现以下错误

WARNING [http-nio-8080-exec-4] org.glassfish.jersey.internal.Errors.logErrors The following warnings have been detected: WARNING: HK2 service reification failed for [com.MyClass] with an exception: MultiException stack 1 of 2 java.lang.IllegalArgumentException: The field field(HttpServletRequest request in com..MyClass) may not be static, final or have an Annotation type

MultiException stack 2 of 2 java.lang.IllegalArgumentException: Errors were discovered while reifying SystemDescriptor( implementation=com.MyClass contracts={com.MyClass} scope=org.glassfish.jersey.process.internal.RequestScoped qualifiers={} descriptorType=CLASS descriptorVisibility=NORMAL metadata= rank=0 loader=null proxiable=null proxyForSameScope=null analysisName=null 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 关键字有什么问题?我该如何修复它?

最佳答案

来自 Java EE 技术生态系统的 JAX-RS API 提供了注释 @Context,用于注入(inject)与 HTTP 请求上下文相关的 12 个对象实例。它的行为分别类似于 Java EE 和 Spring 中的 @Inject@Autowired 注释。

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

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

这是注入(inject)实例字段的示例:

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

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

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

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

关于java - HttpServletRequest 字段可能不是静态的、最终的或有 Jersey 2 的注释类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53851055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com