JAX-RS получает сущность как объект JAXB и как строку - PullRequest
4 голосов
/ 01 декабря 2009

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

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

Ответы [ 2 ]

2 голосов
/ 04 декабря 2009

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

@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 всего за несколько строк кода.

0 голосов
/ 03 декабря 2009

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

...