I am using jersey for a REST WS. How do I enable jersey logs at server side?
我正在使用针对REST WS的球衣。如何在服务器端启用泽西日志?
Long story: I get a clientside exception - but I don't see anything in tomcat logs [It doesn't even reach my method]. Since the stack trace is saying "toReturnValue" it did get something from server. But I don't know what the server said.
长话:我得到了一个客户端例外 - 但我没有在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)
5 个解决方案
#1
58
If you want to turn on logging on the server side, you need to register the LoggingFilter Jersey filter (on the container side).
如果要打开服务器端的日志记录,则需要注册LoggingFilter Jersey过滤器(在容器端)。
This filter will log request/response headers and entities.
此过滤器将记录请求/响应标头和实体。
Here's what you need to add to your ResourceConfig
class:
以下是您需要添加到ResourceConfig类的内容:
@ApplicationPath("/")
public class MyApplication extends ResourceConfig {
public MyApplication() {
// Resources.
packages(MyResource.class.getPackage().getName());
register(LoggingFilter.class);
}
}
Note that the same filter also works on the client side.
请注意,相同的过滤器也适用于客户端。
Client client = Client.create();
client.addFilter(new LoggingFilter());
#2
19
Jersey 2 has deprecated LoggingFilter
and you now need to use LoggingFeature
. In order to use it with a client you can use the following snipette:
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();
and on the server side:
在服务器端:
ResourceConfig config = new ResourceConfig(HelloWorldResource.class);
config.register(LoggingFeature.class);
#3
7
Jersey 2.0 uses org.glassfish.jersey.filter.LoggingFilter
You can connect it with help of web.xml
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>
More explanations can be found here
可以在这里找到更多解释
upd:
UPD:
After version 2.23 LoggingFilter
is deprecated and LoggingFeature
should be used. More info can be found in official documentation
在版本2.23之后,不推荐使用LoggingFilter,并且应该使用LoggingFeature。更多信息可以在官方文档中找到
#4
6
For Jersey 1.2 add the following entry into web.xml
inside the servlet tag:
对于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>
#5
3
Could you show us your client code and tell us about the request as well?
你能告诉我们你的客户代码并告诉我们这个请求吗?
This exception seems to point at the JAXB unmarshalling step. Apparently you received some XML from your REST API, but you don't get what you're waiting for.
这个异常似乎指向了JAXB解组步骤。显然,您从REST API收到了一些XML,但是您没有得到您正在等待的内容。
Maybe the XSD you're using for marshalling/unmarshalling is outdated or just plain wrong.
Maybe you're trying to get the wrong entity from the response.
也许你用于编组/解组的XSD已经过时或者说是完全错误的。也许你正试图从响应中获取错误的实体。
Try these steps and give us some more details about your problem:
尝试以下步骤,并提供有关您的问题的更多详细信息:
Get the XML from the response
Using a REST client like Client REST simple (a chrome extension), or your code:
使用REST客户端,如Client REST simple(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);
Validate this XML with the XSD you're using
This test should fail (if I'm right).
这个测试应该失败(如果我是对的)。
#1
58
If you want to turn on logging on the server side, you need to register the LoggingFilter Jersey filter (on the container side).
如果要打开服务器端的日志记录,则需要注册LoggingFilter Jersey过滤器(在容器端)。
This filter will log request/response headers and entities.
此过滤器将记录请求/响应标头和实体。
Here's what you need to add to your ResourceConfig
class:
以下是您需要添加到ResourceConfig类的内容:
@ApplicationPath("/")
public class MyApplication extends ResourceConfig {
public MyApplication() {
// Resources.
packages(MyResource.class.getPackage().getName());
register(LoggingFilter.class);
}
}
Note that the same filter also works on the client side.
请注意,相同的过滤器也适用于客户端。
Client client = Client.create();
client.addFilter(new LoggingFilter());
#2
19
Jersey 2 has deprecated LoggingFilter
and you now need to use LoggingFeature
. In order to use it with a client you can use the following snipette:
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();
and on the server side:
在服务器端:
ResourceConfig config = new ResourceConfig(HelloWorldResource.class);
config.register(LoggingFeature.class);
#3
7
Jersey 2.0 uses org.glassfish.jersey.filter.LoggingFilter
You can connect it with help of web.xml
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>
More explanations can be found here
可以在这里找到更多解释
upd:
UPD:
After version 2.23 LoggingFilter
is deprecated and LoggingFeature
should be used. More info can be found in official documentation
在版本2.23之后,不推荐使用LoggingFilter,并且应该使用LoggingFeature。更多信息可以在官方文档中找到
#4
6
For Jersey 1.2 add the following entry into web.xml
inside the servlet tag:
对于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>
#5
3
Could you show us your client code and tell us about the request as well?
你能告诉我们你的客户代码并告诉我们这个请求吗?
This exception seems to point at the JAXB unmarshalling step. Apparently you received some XML from your REST API, but you don't get what you're waiting for.
这个异常似乎指向了JAXB解组步骤。显然,您从REST API收到了一些XML,但是您没有得到您正在等待的内容。
Maybe the XSD you're using for marshalling/unmarshalling is outdated or just plain wrong.
Maybe you're trying to get the wrong entity from the response.
也许你用于编组/解组的XSD已经过时或者说是完全错误的。也许你正试图从响应中获取错误的实体。
Try these steps and give us some more details about your problem:
尝试以下步骤,并提供有关您的问题的更多详细信息:
Get the XML from the response
Using a REST client like Client REST simple (a chrome extension), or your code:
使用REST客户端,如Client REST simple(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);
Validate this XML with the XSD you're using
This test should fail (if I'm right).
这个测试应该失败(如果我是对的)。