Jaxb2Marshaller не удается разобрать в присутствии '&'
Я использую org.springframework.oxm.jaxb.Jaxb2Marshaller, чтобы отменить запрос xml. Сбой отмены маршалинга из-за присутствия '&' (амперсанд) в запросе, даже если кодировка установлена в прологе как
requestXML -
<?xml version="1.0" encoding="utf-8"?><createaccountrequest><username>Test&jsongg</username><userpassword>12345</userpassword></createaccountrequest>
Исключение, которое я получаю, как показано ниже
500 - внутренняя ошибка сервера org.springframework.http.converter.HttpMessageNotReadableException: не удалось отключить [class com.marketplace.system.customer.service.component.request.vo.AccountRequestVO]: null; вложенным исключением является javax.xml.bind.UnmarshalException - со связанным исключением: [org.xml.sax.SAXParseException: ссылка на сущность "jsongg1h61" должна заканчиваться символом ';' разделитель.] at org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter.readFromSource(Jaxb2RootElementHttpMessageConverter.java:82) ~[spring-web-3.1.0.RELEASE.jar:3.1.0.RELE at org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.readInternal(AbstractXmlHttpMessageConverter.java:61) ~[spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:153) ~[spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:120) ~[spring-webmvCE 3.1.0.RR
Любые указатели были бы большой помощью.
заранее спасибо
1 ответ
Ошибка парсера правильна как
<username>Test&jsongg</username>
не правильно сформирован XML. Если вы хотите использовать амперсанд в содержимом элемента в XML, его нужно экранировать как &
,
Правила вокруг символьных данных XML - какие символы можно использовать как есть, какие экранировать (и как) и какие полностью запрещены даже в экранированной форме - сложны, и если вы хотите генерировать XML, вы должны использовать XML-библиотека, чтобы сделать это, а не пытаться сделать это вручную. Тем не менее, вы можете достичь желаемого с помощью CDATA. Следующее хорошо сформировано:
<username><![CDATA[Test&jsongg]]></username>
Блоки текста, начинающиеся с <![CDATA[
и заканчивая ]]>
парсерсы, знаки "меньше" и т. д. теряют свое особое значение как обычный текст. Здесь следует обратить внимание на то, что разделы CDATA не вкладываются, поэтому, если значение, которое вы переносите в CDATA, содержит подстроку из трех символов ]]>
тогда это нужно будет "избежать", заменив его чем-то вроде ]]]]><![CDATA[>
(]]
, затем конец раздела CDATA и сразу же начать другой, продолжая с >
).