如何在服务器上得到jersey日志?

我正在使用jersey作为REST WS。 如何在服务器端启用jersey日志?

长话短说:我得到一个客户端的例外 – 但我没有看到任何东西在tomcat日志[它甚至没有达到我的方法]。 由于堆栈跟踪说“toReturnValue”它确实从服务器获得的东西。 但是我不知道服务器说什么。

Exception in thread "main" java.lang.IllegalArgumentException: source parameter must not be null at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:98) at com.sun.xml.internal.ws.message.AbstractMessageImpl.readPayloadAsJAXB(AbstractMessageImpl.java:100) **at com.sun.xml.internal.ws.client.dispatch.JAXBDispatch.toReturnValue(JAXBDispatch.java:74)** at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.doInvoke(DispatchImpl.java:191) at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.invoke(DispatchImpl.java:195) 

如果要打开服务器端的日志logging,则需要注册LoggingFilter Jerseyfilter (位于容器一侧)。

这个filter将logging请求/响应头和实体

以下是您需要添加到您的ResourceConfig类的内容:

 @ApplicationPath("/") public class MyApplication extends ResourceConfig { public MyApplication() { // Resources. packages(MyResource.class.getPackage().getName()); register(LoggingFilter.class); } } 

请注意,相同的filter也适用于客户端。

 Client client = Client.create(); client.addFilter(new LoggingFilter()); 

Jersey 2已弃用LoggingFilter ,现在您需要使用LoggingFeature 。 为了和客户一起使用,你可以使用下面的snipette:

 this.client = ClientBuilder .newBuilder() .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_CLIENT, LoggingFeature.Verbosity.PAYLOAD_ANY) .property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_CLIENT, "WARNING") .build(); 

在服务器端:

 ResourceConfig config = new ResourceConfig(HelloWorldResource.class); config.register(LoggingFeature.class); 

对于Jersey 1.2,将以下条目添加到servlet标记内的web.xml

  <init-param> <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value> </init-param> 

Jersey 2.0使用org.glassfish.jersey.filter.LoggingFilter
你可以在web.xml的帮助下连接它

 <!-- Register my custom provider (not needed if it's in my.package) AND LoggingFilter. --> <init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.filter.LoggingFilter</param-value> </init-param> 

更多的解释可以在这里find

UPD:

在版本2.23之后,不推荐使用LoggingFeature应使用LoggingFeature 。 更多信息可以在官方文档中find

你能告诉我们你的客户代码,并告诉我们有关请求吗?

这个exception似乎指向了JAXB解组步骤。 显然你从REST API中收到了一些XML,但是你没有得到你正在等待的东西。

也许你用来编组/解编的XSD已经过时了,或者只是错误的。
也许你试图从响应中得到错误的实体。

尝试这些步骤,并给我们一些关于你的问题的更多细节:

从响应中获取XML

使用REST客户端(如REST简单客户端 (Chrome扩展))或代码:

 Builder builder = webResource.path("/yourapi/").accept("application/xml"); // get the client response ClientResponse response = builder.get(ClientResponse.class); // log the HTTP Status logger.log("HTTP Status: " + response.getStatus()); // bypass the jaxb step and get the full response // MyResource myResource = response.getEntity(MyResource.class); String myResource = response.getEntity(String.class); logger.log(myResource); 

使用您正在使用的XSDvalidation此XML

这个testing应该会失败(如果我是对的)。