JAX-RS получает сущность как объект JAXB и как строку

У меня есть веб-служба JAX-RS (с использованием трикотажа), которая принимает объект JAXB в качестве объекта запроса. Когда мы получаем ошибку, мы хотим зарегистрировать исходную строку xml, которая была отправлена ​​​​нам. В настоящее время я просто повторно упорядочиваю объект JAXB, но, поскольку у нас есть несколько перечислений java в этих классах, значения перечисления, которые неправильно написаны в исходной строке xml, теряются, что неприемлемо для наших целей.

Кто-нибудь знает способ получить объект запроса как в виде строки, так и в виде объекта JABX? Я бы предпочел не писать собственный MessageBodyReader и не пытаться получить MessageBodyReader для JAXB, если это возможно. Вы также можете использовать специальные классы для джерси. Мы используем версию 1.0.x.


person Matt Campbell    schedule 01.12.2009    source источник


Ответы (2)


Оказывается, это не так сложно сделать с помощью JAX-RS API. Вот что я сделал:

@Path("/transactions")
public class TestResource<X> {

    private Class<X> jaxbClass;

    @POST
    @Path("/{transaction-id}")
    @Consumes("application/xml")
    public Response processPost(@Context Providers providers, @Context HttpHeaders httpHeaders, @PathParam("transaction-id") final long transactionId,
            final String xmlString) throws WebApplicationException, IOException {

        MessageBodyReader<X> reader = providers.getMessageBodyReader(jaxbClass, null, null, MediaType.APPLICATION_XML_TYPE);
        InputStream entityStream = new ByteArrayInputStream(xmlString.getBytes());
        final X xmlObject = reader.readFrom(jaxbClass, null, null, MediaType.APPLICATION_XML_TYPE, httpHeaders.getRequestHeaders(), entityStream);

        //insert logic here

        return Response.ok().build();
    }
}

Это даст вам xml в виде строки и объекта JAXB всего за несколько строк кода.

person Matt Campbell    schedule 04.12.2009

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

person Eugene Kuleshov    schedule 03.12.2009