Обработка CData в Stax и jaxb

Я пытаюсь написать фрагмент XML, содержащий элемент CData, в Spring StaxtItemWriter и Jaxb marshaller. Но вывод либо:

  • не обертывать <![CDATA[ ... ]]>
  • или сбежал: < и > заменены на &lt; и &gt;

Во-первых, автор статьи:

<bean id="userAuthorizationErrorItemWriter"
    class="org.springframework.batch.item.xml.StaxEventItemWriter">
    <property name="rootTagName" value="UserAuthorizationEvent" />
    <property name="rootElementAttributes">
        <map>
            <entry key="xmlns:xsi" value="http://www.w3.org/2001/XMLSchema-instance" />
        </map>
    </property>
    <property name="marshaller" ref="userAuthorizationTypeMarshaller" />
    <property name="overwriteOutput" value="true" />
    <property name="resource" value="file://C:/TEMP/fichierOUT.xml" />
    <property name="transactional" value="false" />
</bean>

Затем маршаллер JAXB

<bean id="userAuthorizationTypeMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="contextPath" value="com.usecase1.xsd.model"/>
</bean>

Класс Java (упрощенный):

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "UserAuthorizationType", propOrder = {"action"})
@XmlRootElement(name = "UserAuthorization")
public class UserAuthorizationType {

    @XmlElement(name = "Action", required = true)
    protected String action;

    public String getAction() {
        return action;
    }

    public void setAction(String value) {
        this.action = value;
    }
}

При записи в файл я хочу, чтобы значение Action было инкапсулировано в блок <![CDATA[ ... ]]>.

Я попытался использовать @XmlJavaTypeAdapter(Adapter1.class), который возвращает:

public String marshal(String value) {
    return "<![CDATA[" + value + "]]>";
}

Но вывод экранирован:

<UserAuthorization><Action>&lt;![CDATA[first, second, third]]&gt;</Action></UserAuthorization>

Есть ли у вас какие-либо идеи?


person fluminis    schedule 04.06.2014    source источник


Ответы (1)


Вам нужно будет создать собственный маршаллер XML и зарегистрировать элементы, которые должны выводиться как CDATA. Посмотрите, помогает ли этот пример https://jaxb.java.net/faq/JaxbCDATASample.java

person Bimalesh Jha    schedule 04.06.2014