我正在尝试将长期运行的REST API服务器从JBoss 7.1.1迁移到Wildfly。该应用程序正在部署罚款,并在大多数情况下工作。但是我的安全拦截器使用@Context加载servlet请求和响应。它在7.1.1下工作正常但在Wildfly下总是为null。
我在以下网址阅读了迁移指南:
并没有看到引用此内容的任何内容。
在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注入不起作用。
在Wildfly中是否需要设置不同的东西才能使其正常工作?
更新:
我查看了资源类中的上下文注入。我开始认为类级注入问题了。方法级别注入似乎工作正常。以下是显示问题的资源示例:
@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中删除了类级注入,还是必须以某种方式启用它?
答案 0 :(得分:1)
通过HttpServletRequest
注入@Context
正在开发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要求此注入必须在@Providers
中与ContainerRequestFilter
一样有效(第9章):
这些信息可用于Application子类(参见第2节)。 1),根资源类(见第3章)和提供者(见第3章) 4)。本章介绍了这些设施。
但是,如果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不再能够在课堂上注入。
可以找到一个简单的测试用例on github。
答案 1 :(得分:0)
据我所知,不支持@Context
注入Filter
实现。您需要从传入的上下文中获取请求/响应。