40

我将球衣用于 REST WS。如何在服务器端启用球衣日志?

长话短说:我得到一个客户端异常 - 但我在 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)
4

5 回答 5

61

如果要在服务器端开启日志,则需要注册LoggingFilter Jersey 过滤器(在容器端)。

此过滤器将记录请求/响应标头和实体

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

@ApplicationPath("/")
public class MyApplication extends ResourceConfig {

    public MyApplication() {
        // Resources.
        packages(MyResource.class.getPackage().getName());

        register(LoggingFilter.class);    
    }
}

请注意,相同的过滤器也适用于客户端。

Client client = Client.create();
client.addFilter(new LoggingFilter());
于 2010-03-02T09:34:54.883 回答
33

Jersey 2 已弃用LoggingFilter,您现在需要使用LoggingFeature. 为了将它与客户端一起使用,您可以使用以下代码片段:

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);
于 2016-10-21T21:50:53.207 回答
10

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

<!-- 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>

更多解释可以在这里找到

更新:

在版本2.23 LoggingFilter被弃用并且LoggingFeature应该使用之后。更多信息可以在官方文档中找到

于 2014-10-12T06:57:25.797 回答
6

web.xml对于 Jersey 1.2,在 servlet 标记内添加以下条目:

    <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>
于 2015-09-07T10:53:01.600 回答
3

您能否向我们展示您的客户代码并告诉我们有关请求的信息?

此异常似乎指向 JAXB 解组步骤。显然,您从 REST API 收到了一些 XML,但您没有得到您正在等待的内容。

也许您用于编组/解组的 XSD 已过时或完全错误。
也许您正试图从响应中获取错误的实体。

请尝试以下步骤,并为我们提供有关您的问题的更多详细信息:

从响应中获取 XML

使用像Client REST simple(一个 chrome 扩展)这样的 REST 客户端,或者你的代码:

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);

使用您正在使用的 XSD 验证此 XML

这个测试应该失败(如果我是对的)。

于 2010-02-26T12:45:21.900 回答