JAXB - Creating modules for reuse

前端 未结 2 792
天命终不由人
天命终不由人 2020-12-02 00:05

Does JAXB support modular code generation?

Most of my background is with JibX for XML marshalling, but for legacy reasons our firm is using JAXB.

One feature

相关标签:
2条回答
  • 2020-12-02 00:49

    Using a JAXB 2.1 implementation (Metro, EclipseLink MOXy, Apache JaxMe, etc), you can specify that schema types correspond to existing classes in order to prevent them from being generated.

    For example:

    root.xsd

    <?xml version="1.0"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/root">
        <xsd:import schemaLocation="imported.xsd" namespace="http://www.example.com/imported"/>
        <xsd:complexType name="root">
            <xsd:attribute name="root-prop" type="xsd:string"/>
        </xsd:complexType>
    </xsd:schema>
    

    imported.xsd

    <?xml version="1.0"?>
    <xsd:schema 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns="http://www.example.com/imported" 
        targetNamespace="http://www.example.com/imported">
        <xsd:complexType name="imported">
            <xsd:attribute name="imported-prop" type="xsd:string"/>
        </xsd:complexType>
    </xsd:schema>
    

    Problem Statement

    If you use the XJC tool to generate java classes from the XML schema:

    xjc -d out root.xsd
    

    You the following is generated:

    com\example\imported\Imported.java
    com\example\imported\ObjectFactory.java
    com\example\imported\package-info.java
    com\example\root\ObjectFactory.java
    com\example\root\Root.java
    com\example\root\package-info.java
    

    imported-bindings.xml

    You can use a JAXB bindings file to specify that types from imported.xsd point to existing classes:

    <jxb:bindings 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
        version="2.1">
    
        <jxb:bindings schemaLocation="imported.xsd">
                <jxb:bindings node="//xs:complexType[@name='imported']">
                    <jxb:class ref="com.example.imported.Imported"/>
                </jxb:bindings>
        </jxb:bindings>
    </jxb:bindings>
    

    Running the XJC

    Now if we run XJC with out bindings file:

    xjc -d out -b imported-bindings.xml root.xsd
    

    None of the files specified in the bindings file will be generated:

    com\example\root\ObjectFactory.java
    com\example\root\Root.java
    com\example\root\package-info.java
    

    Alternative Approach

    The code generated from the imported schema directly (xjc imported.xsd) and indirectly (xjc root.xsd) is the same. You can simply drop the code generated indirectly and point at the project containing the code that was generated directly.

    0 讨论(0)
  • 2020-12-02 01:00

    For the JAXB RI, that's handled with "episode" files (these are really just customization files). Process the core schema first, making sure to have xjc use the -episode <file> arg. Package the results of that processing into a JAR file with the episode file in META-INF/sun-jaxb.episode. Then, pass that JAR file as an arg to xjc when processing the other schemas.

    0 讨论(0)
提交回复
热议问题