Я использую Джерси с JAXB для преобразования своего ответа в XML.У меня есть несколько методов, которые используют XML из тела запроса.Я могу указать bean-компонент в качестве параметра вызываемого метода, и JAXB будет использоваться для автоматического преобразования данных тела запроса в этот bean-компонент или произойдет сбой, если он не совместим.
Это прекрасно работает для большинства моих дел, и у меня не было необходимости писать MessageBodyReader или MessageBodyWriter для обработки преобразования в и из.У меня есть один экземпляр, где мне нужно сопоставить тело запроса с компонентом, но мне также нужен исходный XML, который был в теле запроса.Мне нужно сохранить это в БД.
Я попытался добраться до тела запроса через HttpContext, и не могу понять, как - я просто вижу значения заголовка и значения URI.Я пробовал через HTTPServletContext, а также заканчивая тем же результатом.
Есть ли способ перехватить тело запроса, как оно есть до его преобразования или после?Нужно ли мне создавать MessageBodyReader для обработки этого случая?Казалось, что они использовались для отображения содержимого в bean-компонент, который у меня уже есть, поэтому я не думал, что это решение.Но, возможно, в MessageBodyReader я могу поместить тело запроса в некоторую переменную и передать его, все еще преобразуя данные в bean-компоненты.Это все еще кажется чем-то большим, чем нужно.Я бы подумал, что смогу как-то добраться до тела через запрос.
Обновление: Я пытался получить тело из объекта ContainerRequest с помощью метода getEntity.
String xmlString = request.getEntity(String.class);
И это прекрасно сработало.Тело запроса фиксируется в этом свойстве, и я могу добавить его в свойства запроса для последующего доступа к ресурсу и т. Д. Проблема в том, и я думаю, это потому, что сущность является потоком, она очищает тело.Таким образом, к тому времени, когда происходит сопоставление jaxb с bean-компонентами, преобразовать уже нечего, и я получил неверный ответ на запрос.
Это не сработало, но я хотел выкинуть его как возможность, есликто-то может заставить его работать лучше.
Вот что я в итоге сделал, и было бы неплохо, чтобы не делать это таким образом.Я в основном собираю то, что было некоммерчески, в моем классе обслуживания.
final StringWriter st = new StringWriter();
try
{
final JAXBContext jaxbContext = JAXBContext.newInstance(full.classpath.and.classname.of.root.bean);
final Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(unmarshalled object, st);
} catch (final JAXBException je)
{
// TODO Auto-generated catch block
je.printStackTrace();
}
final String xml = st.toString();
Итак, вы можете видеть - я в основном беру объект, корневой боб, к которому было обращено тело, и собираю его, даваярасположение аннотированного корневого бина для использования в маршаллинге.
Кажется немного странным, что приходится маршалировать то, что уже было не маршалированным, и, если это ответ, возможно, маршаллировать снова при выходе.Я хотел бы получить решение, в котором я мог бы получить копию тела до того, как произойдет демонтаж.Но пока что это должно сработать.