使用Moxy作为JAXB实现并使用多个POJO包设置jaxb.properties

时间:2014-10-16 11:21:59

标签: maven jaxb moxy

我目前正在尝试使用EclipseLink Moxy作为我的JAXB实现。我正在尝试这个,因为JDK中包含的默认实现似乎有一个UTF-8编码的硬编码缩进级别为8。

我的问题是,似乎我必须将jaxb.properties文件放入包含JAXB POJO的每个包中。我的JAXB POJO由xjc生成,特别是由jaxb2-maven-plugin'生成。 POJO生成许多包。是否有可能设置使用的实现而不在这些包中创建冗余的jaxb.properties文件?

1 个答案:

答案 0 :(得分:3)

  

我正在尝试这个,因为默认实现包含在   JDK似乎有一个UTF-8的硬编码缩进级别为8   编码

JAXB参考实现确实有一个扩展属性,允许您控制缩进:


jaxb.properties而言,当使用单个JAXBContext处理多个包时,只有一个包需要包含jaxb.properties文件。

有一些不同的方法可以让你更轻松地使用MOXy:

使用MOXy的XJC Wrapper

MOXy提供了一个包装XJC的脚本,它将jaxb.properties文件添加到适当的位置。

<ECLIPSELINK_HOME>/bind/jaxb-compiler.sh

使MOXy成为您环境中的默认JAXB提供程序

您还可以利用META-INF/services机制将MOXy指定为默认的JAXB提供程序:

  1. 在目录javax.xml.bind.JAXBContext
  2. 中创建一个包含名为META-INF/services的文件的JAR
  3. javax.xml.bind.JAXBContext文件的内容必须为org.eclipse.persistence.jaxb.JAXBContextFactory
  4. 将该jar添加到类路径中。
  5. 使用Native MOXy API

    import java.io.File;
    import javax.xml.bind.*;
    import org.eclipse.persistence.jaxb.JAXBContextFactory;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContextFactory.createContext("com.example.pkg1:org.example.pkg2", null, null);
    
            Unmarshaller unmarshaller = jc.createUnmarshaller();
            File xml = new File("input.xml");
            Object object = unmarshaller.unmarshal(xml);
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(object, System.out);
        }
    
    }