【问题标题】:Resteasy 3 @Context HttpServletRequest always nullResteasy 3 @Context HttpServletRequest 始终为空
【发布时间】:2018-06-26 23:01:33
【问题描述】:

我们使用的是 Resteasy 2,但我们正在升级到 Resteasy 3,HttpServletRequest 注入始终是 null

我们修改后的安全拦截器/过滤器如下所示:

@Provider
@ServerInterceptor
@Precedence("SECURITY")
public class SecurityInterceptor implements ContainerRequestFilter, ContainerResponseFilter {

    @Context
    private HttpServletRequest servletRequest;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {

        // Need access to "servletRequest" but it is always null

        if (!isTokenValid(pmContext, method)) {
            requestContext.abortWith(ACCESS_DENIED);
        }
    }


    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        // post processing
    }
}

应用程序类看起来像:

@ApplicationPath("/")
public class RestApplication extends Application {
    private Set<Object> singletons = new HashSet<Object>();
    private Set<Class<?>> empty = new HashSet<Class<?>>();

    public RestApplication() {

        // Interceptors
        this.singletons.add(new SecurityInterceptor());

        // Services
        this.singletons.add(new MyService());
    }

    public Set<Class<?>> getClasses() {
        return this.empty;
    }

    public Set<Object> getSingletons() {
        return this.singletons;
    }
}

示例 API:

@Path("/test")
public class MyService extends BaseService {

    @Context HttpServletRequest servletRequest;

    @GET
    @Path("/hello")
    @Produces(MediaType.APPLICATION_JSON)
    public Response hello() {

        // Need access to HttpServletRequest but it's null

        return Response.ok("hello").build();
    }
}

但是,查看thisthis 的帖子,我没有看到HttpServletRequest 注入提供者。

这让我相信我可能需要一个额外的插件。这是安装的:

jose-jwt
resteasy-atom-provider
resteasy-cdi
resteasy-crypto
resteasy-jackson2-provider
resteasy-jackson-provider
resteasy-jaxb-provider
resteasy-jaxrs
resteasy-jettison-provider
resteasy-jsapi
resteasy-json-p-provider
resteasy-multipart-provider
resteasy-spring
resteasy-validator-provider-11
resteasy-yaml-provider

有什么想法吗?

【问题讨论】:

  • 尝试将它们添加到类中(而不是单例)并让 resteasy 创建它们。
  • @peeskillet 感谢您的回复。你的建议奏效了。

标签: jboss jax-rs wildfly resteasy undertow


【解决方案1】:

根据 @peeskillet 的建议,修改为返回新的类实例而不是单例解决了我的问题。

因此我修改后的javax.ws.rs.core.Application 文件看起来像:

@ApplicationPath("/")
public class RestApplication extends Application {
    private Set<Object> singletons = new HashSet<Object>();
    private Set<Class<?>> classes = new HashSet<Class<?>>();

    public RestApplication() {

        // Interceptors
        this.classes.add(SecurityInterceptor.class);

        // Services
        this.classes.add(MyService.class);
    }

    public Set<Class<?>> getClasses() {
        return this.classes;
    }

    public Set<Object> getSingletons() {
        return this.singletons;
    }
}

【讨论】:

    【解决方案2】:

    您可以使用 SecurityInterceptor 的构造函数来获取这些值:

    ///...
        private HttpServletRequest request;
        private ServletContext context;
    
        public SecurityInterceptor(@Context HttpServletRequest request, @Context ServletContext context) {
           this.request = request;
           this.context = context;
        }
    
        @Override
        public void filter(ContainerRequestContext requestContext) throws IOException {
    
            // The "servletRequest" won't be null anymore
            if (!isTokenValid(pmContext, method)) {
                requestContext.abortWith(ACCESS_DENIED);
            }
        }
    
     ///...
    

    这会解决你的问题

    【讨论】:

    • 感谢您的解决方案。我最终采用了@peeskillet 推荐的方法,因为我们必须在许多地方进行更改才能接受构造函数中的值。
    • 我很乐意提供帮助。我没有看到 "new SecurityInterceptor()" ,但这也是个问题。
    猜你喜欢
    • 2021-11-04
    • 2018-06-12
    • 2017-07-01
    • 1970-01-01
    • 2016-03-19
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多