Получить данные из запроса JSON

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

Я внедрил ContainerResponseFilter и ввел Providers, через который Я получил MessageBodyWriter для конкретной сущности ответа и конкретного MediaType; затем я использовал его для записи объекта в доступный OutputStream, который я использовал для регистрации объекта.

Этот подход позволяет вам фиксировать точную полезную нагрузку ответа, а не только объект, прикрепленный к Response, то есть, если объект будет сериализован как JSON, тогда вы запишете JSON, если он будет сериализован как XML, вы запишете XML. Если использовать метод toString() прикрепленного объекта, этот подход является просто бесполезной вычислительной стоимостью.

Вот код (трюк выполняется в функции CustomResponseLogger.payloadMessage):

@Provider
public class CustomResponseLogger implements ContainerResponseFilter {
    private static final Logger LOGGER = LoggerFactory.getLogger(CustomResponseLogger.class);

    @Context private Providers providers;

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        String message = new String("Outgoing message").concat(System.lineSeparator());
        if (responseContext.getMediaType() != null) 
            message = message.concat("Content-Type: ").concat(responseContext.getMediaType().toString()).concat(System.lineSeparator());
        message = message.concat("Payload: ").concat(payloadMessage(responseContext)).concat(System.lineSeparator());
        LOGGER.info(message);
    }

    private String payloadMessage(ContainerResponseContext responseContext) throws IOException {
        String message = new String();
        if (responseContext.hasEntity()) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();           
            Class<?> entityClass = responseContext.getEntityClass();
            Type entityType = responseContext.getEntityType();
            Annotation[] entityAnnotations = responseContext.getEntityAnnotations();
            MediaType mediaType = responseContext.getMediaType();
            @SuppressWarnings("unchecked")
            MessageBodyWriter<Object> bodyWriter = (MessageBodyWriter<Object>) providers.getMessageBodyWriter(entityClass, 
                    entityType, 
                    entityAnnotations, 
                    mediaType); // I retrieve the bodywriter
            bodyWriter.writeTo(responseContext.getEntity(), 
                    entityClass, 
                    entityType, 
                    entityAnnotations, 
                    mediaType, 
                    responseContext.getHeaders(), 
                    baos); // I use the bodywriter to write to an accessible outputStream
            message = message.concat(new String(baos.toByteArray())); // I convert the stream to a String
        }
        return message;
    }
}

Надеюсь, это поможет!

0
задан John Kugelman 5 March 2019 в 02:55
поделиться