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, его нужно экранировать как &amp;,

Правила вокруг символьных данных XML - какие символы можно использовать как есть, какие экранировать (и как) и какие полностью запрещены даже в экранированной форме - сложны, и если вы хотите генерировать XML, вы должны использовать XML-библиотека, чтобы сделать это, а не пытаться сделать это вручную. Тем не менее, вы можете достичь желаемого с помощью CDATA. Следующее хорошо сформировано:

<username><![CDATA[Test&jsongg]]></username>

Блоки текста, начинающиеся с <![CDATA[ и заканчивая ]]> парсерсы, знаки "меньше" и т. д. теряют свое особое значение как обычный текст. Здесь следует обратить внимание на то, что разделы CDATA не вкладываются, поэтому, если значение, которое вы переносите в CDATA, содержит подстроку из трех символов ]]> тогда это нужно будет "избежать", заменив его чем-то вроде ]]]]><![CDATA[> (]], затем конец раздела CDATA и сразу же начать другой, продолжая с >).

Другие вопросы по тегам