Как получить журналы Джерси на сервере?

Я использую трикотаж для 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)

Ответ 1

Если вы хотите включить ведение журнала на стороне сервера, вам необходимо зарегистрировать фильтр 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());

Ответ 2

Джерси 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);

Ответ 3

Для Jersey 1.2 добавьте следующую запись в 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>

Ответ 4

Джерси 2.0 использует org.glassfish.jersey.filter.LoggingFilter
Вы можете подключить его с помощью web.xml

<!-- Register my custom provider (not needed if it 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>

Более подробные объяснения можно найти здесь

UPD:

После версии 2.23 LoggingFilter устарела и LoggingFeature следует использовать. Более подробную информацию можно найти в официальной документации

Ответ 5

Не могли бы вы показать нам свой код клиента и рассказать нам о запросе?

Это исключение, похоже, указывает на шаг Unmarshalling JAXB. Очевидно, вы получили XML-код от вашего REST API, но вы не получите того, чего ожидаете.

Возможно, 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);

Подтвердить этот XML с помощью XSD, который вы используете

Этот тест должен завершиться неудачно (если я прав).