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

StackOverflow https://stackoverflow.com/questions/1828526

  •  11-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Оказывается, не так уж сложно сделать это с помощью 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 всего в нескольких строках кода.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top