Как получить журналы Джерси на сервере?
Я использую трикотаж для 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, который вы используете
Этот тест должен завершиться неудачно (если я прав).