java – 依赖注入ResourceFilter不起作用?

我有一堆JAX-RS资源,为新的WebService提供API.为了理解发生了什么,我想将有关每个请求的信息存储在数据仓库中.在我看来,这是一个跨领域关注的完美范例,可以通过ResourceFilter实现,对吗?

所以我构建了一个DataWarehouseService,它应该在DB中存储东西:

@Stateless
@LocalBean
public class DataWarehouseService {

    public void logApiCall(ContainerRequest cr) {
        // get interesting fields from request, store in DB
        ...
    }
}

这是我的过滤器:

public class LoggingResourceFilter implements ResourceFilter {

    Logger log = Logger.getLogger(this.getClass().getName());

    @EJB
    DataWarehouseService dwh;

    @Override
    public ContainerRequestFilter getRequestFilter() {

        return new ContainerRequestFilter() {
            @Override
            public ContainerRequest filter(ContainerRequest cr) {
                log.info("Incoming request: "+
                        cr.getHeaderValue("user-agent") +" "+
                        cr.getMethod() +" "+
                        cr.getPath()
                        );

                dwh.logApiRequest(cr);
                return cr;
            }
        };
    }

    @Override
    public ContainerResponseFilter getResponseFilter() {
        return null;
    }
}

我通过类级别上的注释@ResourceFilters(LoggingResourceFilter.class)将过滤器注入我的JAX-RS资源.

Filter-injection工作正常,当我访问其中一个JAX-RS资源时,日志语句(“Incoming request:…”)被执行.但紧接着,对注入的DataWarehouseService的dwh.logApiRequest(cr)的调用因Nullpointer而失败 – 显然注入失败了?!

这有什么问题?我想,ResourceFilters是可以管理的,可以使用CDI.我错了吗?

所有这些都在Glassfish 3.1.1上运行,Jersey 1.8是JAX-RS提供商.如果我使用@Inject会有所作为吗?

最佳答案 好吧,我是个白痴.

将@Stateless注释添加到LoggingResourceFilter修复它.

点赞