Jersey - 如何在servlet之外使用@Context注释?

时间:2014-07-09 09:34:38

标签: java rest jersey

我正在尝试设置Jersey ClientResponseFilter。它工作正常,但我想将我的请求参数反序列化为String,这样我就可以将有用的消息写入包含实际数据的日志文件中。

我正在考虑使用MessageBodyWorkers。如下面的链接所示: "如果您需要直接使用JAX-RS实体提供程序,例如在资源方法,过滤器或复合实体提供程序中序列化实体,则需要执行相当多的步骤。&# 34;

来源:7.4. Jersey MessageBodyWorkers API

这正是我想要阻止的。

所以我正在考虑将messagebodyworkers注入我的过滤器中,如下所示:

package somepackage.client.response;

import java.io.IOException;

import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.Provider;

import org.glassfish.jersey.message.MessageBodyWorkers;
import org.slf4j.Logger;

@Provider
public class ResponseFilter implements ClientResponseFilter {

    // TODO: these workers are not injected
    @Context
    private MessageBodyWorkers workers;
    private final Logger logger;

    public ResponseFilter(Logger logger) {
        this.logger = logger;
    }

    @Override
    public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext)
            throws IOException {
        if (responseValid(responseContext)) {
            return;
        }
        logger.error("Error", "Some param");
    }

    private boolean responseValid(ClientResponseContext responseContext) {
        if (responseContext.getStatus() == HttpServletResponse.SC_OK) {
            return true;
        }
        return false;
    }

}

但引用始终为null并保持为null。请注意,此筛选器在独立应用程序中运行,没有可用的servlet容器。

为什么在这种情况下注释不起作用?我怎样才能使它工作?或者如果不能使这种方法起作用,我该如何解决这个问题?

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

行。以下是上述问题的解决方案:我们应该使用@Inject和HK2依赖注入内核

HK2 Dependency Injection Kernel Link

首先我们需要对过滤器进行一些更改:

package somepackage.client.response;

import java.io.IOException;

import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;

import org.glassfish.jersey.message.MessageBodyWorkers;
import org.slf4j.Logger;

public class ResponseFilter implements ClientResponseFilter {

    @Inject
    private MessageBodyWorkers workers;
    private Logger logger;

    @Override
    public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext)
            throws IOException {
        if (responseValid(responseContext)) {
            return;
        }
        logger.error("Error", "Some param");
    }

    private boolean responseValid(ClientResponseContext responseContext) {
        if (responseContext.getStatus() == HttpServletResponse.SC_OK) {
            return true;
        }
        return false;
    }

    public void setLogger(Logger logger) {
        this.logger = logger;
    }

}

如您所见,构造函数已更改,该类使用默认构造函数,并且注释更改为@Inject。请注意,有两个具有相同名称的@Inject注释。请确保使用:javax.inject.Inject。

然后我们需要实现org.glassfish.hk2.utilities.binding.AbstractBinder:

package somepackage.client;

import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.message.MessageBodyWorkers;
import org.glassfish.jersey.message.internal.MessageBodyFactory;

public class Binder extends AbstractBinder {

    @Override
    protected void configure() {
        bind(MessageBodyFactory.class).to(MessageBodyWorkers.class);
    }

}

最后我们应该在客户端注册过滤器和我们的活页夹:

...
        client.register(ResponseFilter.class);
        client.register(new SitemapBinder());
...

然后工人将被罚款。