Как я могу заставить Jersey 2.2 (JAX-RS) генерировать выходные данные журнала, включая органы запроса Json
Я запускаю сервлет Джерси 2.2 внутри Jetty 9.0.4, чтобы обслуживать запросы REST.
В основном все хорошо, и запросы подаются, но я никогда не видел журнал ЛЮБОЙ из классов Джерси. И я не могу найти ни одного документа, указывающего, какие куры мне нужно жертвовать, чтобы это произошло с Джерси 2.2.
Итак, мой первый вопрос: что мне нужно сделать, чтобы заставить Джерси создать какой-то журнал.
Когда запрос выполняется с ошибкой (например, поскольку тело запроса Json не может быть проанализировано), Джерси выкинет ContainerException с сообщением типа "Невозможно десериализовать экземпляр java.util.ArrayList из токена START_OBJECT" и т.д. При этом что было бы действительно прекрасным, чтобы зарегистрировать входящий запрос, чтобы я мог проверить Json. Опять же, я не могу найти ничего в текущей доко, излагающей такого зверя, хотя я уверен, что он есть. И в любом случае, пока я не разрешу вопрос 1 выше, он будет спорным.
Итак, мой второй вопрос заключается в том, как я могу регистрировать тело входящего запроса (без нарушения запроса).
Конфигурация "Джерси сервлета" в web.xml выглядит так:
<servlet >
<servlet-name>Jersey Servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>au.com.xandar.wirelesstiming.recorder.web.rest.JerseyApplication</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.filter.LoggingFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
My JerseyApplication:
public final class JerseyApplication extends ResourceConfig {
public JerseyApplication() {
super(
//JacksonFeature.class // Switching on Jackson
// (My) JerseyLoggingFilter.class // Log requests using Jersey ContainerRequestFilter
MyApplicationEventListener.class // Log Requests using Jersey RequestEventListener
);
packages("au.com.xandar.wirelesstiming.recorder");
// Enable LoggingFilter & output entity.
// NB This does NOT generate any log.
registerInstances(new LoggingFilter(Logger.getLogger(JerseyApplication.class.getName()), true));
}
}
Ответы
Ответ 1
Джерси не регистрируется много. Для 2.x мы работаем над режимом разработки, который будет включать поддержку трассировки (см. Трассировка в Джерси), регистрацию входящих запросов/исходящих сообщений по умолчанию ответы (включая тела лиц и трассировочные сообщения). Эта функция должна быть скоро.
Что касается второго вопроса - вы можете зарегистрировать LoggingFilter, который может регистрировать входящие запросы/исходящие ответы (метод, заголовки,..), а также сущности (при настройке). Вы можете настроить его с помощью (3-й вариант показывает, как включить ведение журнала объекта):
web.xml
(добавьте его в определение сервлетов JAX-RS):
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.filter.LoggingFilter</param-value>
</init-param>
Application
extension:
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
return new HashSet<Class<?>>() {{
// Add your resources.
add(HelloWorldResource.class);
// Add LoggingFilter.
add(LoggingFilter.class);
}};
}
}
ResourceConfig
экземпляр (демонстрирующий также вывод объекта здесь):
public class MyApplication extends ResourceConfig {
public MyApplication() {
// Resources - add your package name here to enable package scanning.
packages(...);
// Enable LoggingFilter & output entity.
registerInstances(new LoggingFilter(Logger.getLogger(MyApplication.class.getName()), true));
}
}