我正在尝试设置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容器。
为什么在这种情况下注释不起作用?我怎样才能使它工作?或者如果不能使这种方法起作用,我该如何解决这个问题?
有什么建议吗?
答案 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());
...
然后工人将被罚款。