JAX-RS получает сущность как объект JAXB и как строку
Вопрос
У меня есть веб-сервис 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 всего в нескольких строках кода.
Другие советы
В качестве идеи вы можете добавить фильтр сервлетов для вашего веб-приложения, который перехватывал бы все запросы и передавал полезную нагрузку в контекст потока, откуда ее можно было бы извлечь позже, если потребуется.