从JBoss 7.1.1迁移到Wildfly时出现@Context问题

时间:2014-08-13 00:25:36

标签: java jboss jboss7.x resteasy wildfly

我正在尝试将长期运行的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注入不起作用。

在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中删除了类级注入,还是必须以某种方式启用它?

2 个答案:

答案 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实现。您需要从传入的上下文中获取请求/响应。

相关问题