0

在尝试使用 JAXB 将 Java 对象编组为 XML 字符串时,我在 Java 1.8 应用程序中遇到了一些问题。第一个问题是,默认情况下编组转义 < 和 > 所以当我试图包装一些字段时

<![CDATA[ my-field-value ]]> 

它正在变成

&lt;![CDATA[ my-field-value ]]&gt;

这首先破坏了使用 CDATA 的功能。根据How to prevent JAXB escaping a string中的一些评论,我使用了自定义字符处理程序。现在一切都对我有用,但我听说我不应该使用 com.sun.xml.internal.* 包,目前我正在这样做(注意使用内部):

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

JAXBContext jc = JAXBContext.newInstance(MyClass.class);
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.setProperty(
                    "com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler",
                    new MyCustomCharacterHandler());
            return marshaller;

MyCustomCharacterHandler 的声明如下(注意内部的使用):

import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;

public class XmlCdataCharacterHandler implements CharacterEscapeHandler {
...
}

这种组合对我来说很好,但是在修改我的代码以摆脱 .internal.* 时,就像使用这个依赖项一样:

    <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-core</artifactId>
      <version>2.2.7</version>
    </dependency>

    import com.sun.xml.bind.marshaller.CharacterEscapeHandler;
    
    public class XmlCdataCharacterHandler implements CharacterEscapeHandler {
    ...
    }

            JAXBContext jc = JAXBContext.newInstance(PrintPack.class);
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.setProperty(
                    "com.sun.xml.bind.marshaller.CharacterEscapeHandler",
                    new MyCustomCharacterHandler());
            return marshaller;

我的服务器将不再启动,并收到带有以下消息的 JAXBException:

name: com.sun.xml.bind.marshaller.CharacterEscapeHandler value: com.fmrco.research.search.handlers.MyCustomCharacterHandler@1f3d4305

这让我觉得我实现 CharacterEscapeHandler 的自定义处理程序不再被正确使用。有谁知道如何解决这个问题,所以我可以保留这个实现,同时避免使用 com.sun.xml.internal.* 包?有没有更好/更新的方法将 java 类转换为 XML 字符串?似乎我不应该一直坚持这一点。谢谢!

4

0 回答 0