Как получить трикотажные логи на сервере? - PullRequest
38 голосов
/ 25 февраля 2010

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

Ответы [ 5 ]

59 голосов
/ 02 марта 2010

Если вы хотите включить ведение журнала на стороне сервера, вам необходимо зарегистрировать фильтр Джерси LoggingFilter (на стороне контейнера).

Этот фильтр будет регистрировать заголовки запросов / ответов и сущности .

Вот что вам нужно добавить в класс 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());
25 голосов
/ 22 октября 2016

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);
7 голосов
/ 12 октября 2014

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

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

UPD:

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

6 голосов
/ 07 сентября 2015

Для Джерси 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>
3 голосов
/ 26 февраля 2010

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

Это исключение указывает на шаг демаршаллинга 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, который вы используете

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...