gpt4 book ai didi

java - 从 JBoss 7.1.1 迁移到 Wildfly 时的 @Context 问题

转载 作者:行者123 更新时间:2023-12-01 12:39:15 25 4
gpt4 key购买 nike

我正在尝试将长时间运行的 REST API 服务器从 JBoss 7.1.1 迁移到 Wildfly。该应用程序部署良好并且大部分工作正常。然而,我的安全拦截器使用 @Context 加载 servlet 请求和响应。它在 7.1.1 下工作正常,但在 Wildfly 下始终为 null。

我通读了迁移指南:

https://docs.jboss.org/author/display/WFLY8/How+do+I+migrate+my+application+from+AS5+or+AS6+to+WildFly

并且没有看到任何引用此内容的内容。

在7.1.1下,这是删除了中间细节的安全拦截器:

@Provider
@ServerInterceptor
@SecurityPrecedence
public class SecurityInterceptor implements PreProcessInterceptor {

@Context
private HttpServletRequest _servletRequest;
@Context
private HttpServletResponse _servletResponse;

@Override
public ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure {
// _servletRequest and _servletResponse are set correctly and are non-null
}
}

我更改了安全拦截器以符合 Resteasy 3.x(某些类已弃用),现在看起来像这样:

@Provider
public class SecurityInterceptor implements ContainerRequestFilter {

@Context
private HttpServletRequest _servletRequest;
@Context
private HttpServletResponse _servletResponse;

@Override
public void filter(ContainerRequestContext requestContext) throws Failure {
// _servletRequest and _servletResponse are always NULL
}
}

我尝试像这样从 RestEasyProviderFactory 加载请求和响应

@Provider
public class SecurityInterceptor implements ContainerRequestFilter {

private HttpServletRequest _servletRequest;
private HttpServletResponse _servletResponse;

@Override
public void filter(ContainerRequestContext requestContext) throws Failure {
_servletRequest = ResteasyProviderFactory.getContextData(HttpServletRequest.class);
_servletResponse = ResteasyProviderFactory.getContextData(HttpServletResponse.class);

// _servletRequest and _servletResponse are now correct
}
}

这样就可以了。所以只是 @Context 注入(inject)不起作用。

是否需要在 Wildfly 中进行不同的设置才能使其正常工作?

更新:

我研究了资源类中的上下文注入(inject)。我开始认为类级注入(inject)是问题所在。方法级注入(inject)似乎工作正常。这是显示问题的资源示例:

@Path("/mypath")
@Produces({MediaType.APPLICATION_JSON})
public class MyResource {
@Context
private HttpServletRequest _httpServletRequest;

@GET
@Path("/path1")
public String test1() {
// _httpServletRequest is null here
}

@GET
@Path("/path2")
public String test2(@Context HttpServletRequest request) {
// request is correct
}

}

Wildfly 中是否删除了类级注入(inject),还是必须以某种方式启用它?

最佳答案

通过 @Context 注入(inject) HttpServletRequest 在 Wildfly 上开箱即用。如already answered here RESTeasy supports the injection of :

  • javax.ws.rs.core.HttpHeaders
  • javax.ws.rs.core.UriInfo
  • javax.ws.rs.core.Request
  • javax.servlet.HttpServletRequest
  • javax.servlet.HttpServletResponse
  • javax.servlet.ServletConfig
  • javax.servlet.ServletContext
  • javax.ws.rs.core.SecurityContext

JAX-RS specification要求此注入(inject)必须像 ContainerRequestFilter 一样在 @Providers 中工作(第 9 章):

Such information is available to Application subclasses (see Section 2. 1), root resource classes (see Chapter 3), and providers (see Chapter 4). This chapter describes these facilities.

但是,如果 RESTeasy 在类路径中找到 beans.xml 并且您自己负责在应用程序中创建 Filter 类,那么您似乎可以轻松跳过此功能,如下所示:

@ApplicationPath("/")
public class RestApplication extends Application {

@Override
public Set<Object> getSingletons() {
HashSet<Object> singletons = new HashSet<>();
singletons.add(new SecurityInterceptor());
return singletons;
}

}

如果都是这种情况,RESTeasy 将不再在类级别注入(inject)。

可以找到一个简单的测试用例 on github .

关于java - 从 JBoss 7.1.1 迁移到 Wildfly 时的 @Context 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25276225/

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