Регистрация сообщений json с помощью resteasy

Я ищу способ регистрации сообщений JSON в рамках RESTEASY.

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

есть ли перехватчик или что-то подобное, что я могу использовать, я нашел пример для PreProcessInterceptor, но похоже, что он устарел.

Я использую resteasy 3.0.8

2 ответов


вы можете использовать ContainerRequestFilter:

@Provider
public class LogFilter implements ContainerRequestFilter {

    private Logger LOG = LoggerFactory.getLogger(LogFilter.class);

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {

        if (!"POST".equals(requestContext.getMethod()) 
                || !MediaType.APPLICATION_JSON_TYPE.equals(requestContext.getMediaType())
                || requestContext.getEntityStream() == null) {
            return;
        }

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        IOUtils.copy(requestContext.getEntityStream(), baos);
        byte[] bytes = baos.toByteArray();
        LOG.info("Posted: " + new String(bytes, "UTF-8"));
        requestContext.setEntityStream(new ByteArrayInputStream(bytes));

    }

}

вместо проверки метода и типа контента вы также можете зарегистрировать этот фильтр на @NameBinding только там, где нужно.

Примечание: этот простой пример копирует InputStream запроса, поэтому он будет прочитан дважды (возможно, проблема производительности).


в качестве дополнения отличного ответа lefloh, я предлагаю заменить:

!MediaType.APPLICATION_JSON_TYPE.equals(requestContext.getMediaType())

С

!MediaType.APPLICATION_JSON_TYPE.isCompatible(requestContext.getMediaType())

равна метод учитывает параметры типа носителя, например. кодировка=кодировка UTF-8, и не работает в некоторых сценариях в соответствии с намерением lefloh. isCompatible сравнивает только тип и подтип типа носителя и более подходит в этом случае.

PS. Я знаю, этот пост должен быть помещен в качестве комментария, но мне недостаточно уровень репутации, чтобы сделать это. Я также отредактировал ответ lefloh, но некоторые ребята php и ios отвергли его.