依赖注入ResourceFilter不起作用?

时间:2011-08-06 10:08:08

标签: java dependency-injection jersey ejb-3.1

我有一堆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的{​​{1}}的调用因Nullpointer而失败 - 显然注入失败了?!

这里有什么问题?我想,dwh.logApiRequest(cr)是受管理的,可以使用CDI。我错了吗?

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

1 个答案:

答案 0 :(得分:2)

好的,我是个白痴。

@Stateless注释添加到LoggingResourceFilter修复它。