Как я могу заставить 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));
    }
}