Bagaimana cara mewarisi superclass selama pembuatan jaxb untuk elemen tertentu?

Saya memiliki skema xsd berikut dan ingin file yang dihasilkan diperluas dari superclass:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="myRequest">
        <xs:complexType>
            ...
        </xs:complexType>
    </xs:element>
</xs:schema>

pengikatan-saya.xml:

<jaxb:bindings    
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    jaxb:extensionBindingPrefixes="xjc"   
    jaxb:version="2.1">

        <jaxb:bindings schemaLocation="xsd/myRequest.xsd">
            <jaxb:bindings node="//xs:element[@name='myRequest']">  
                <xjc:superClass name="com.commons.MyMessage"/>
            </jaxb:bindings>
        </jaxb:bindings>    

</jaxb:bindings>

pom.xml:

<plugin>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-xjc-plugin</artifactId>
        <configuration>
              <extensions>
                <extension>org.apache.cxf.xjcplugins:cxf-xjc-ts:${maven.cxf-xjc-ts.plugin}</extension>
                <extension>org.jvnet.jaxb2_commons:jaxb2-basics:0.11.0</extension>
              </extensions>
            </configuration>
        <executions>
            <execution>
                <id>generate-sources</id>
                <phase>generate-sources</phase>

                <!-- Global configuration for all xsd autogenerated resources. default ws location is: src/main/resources/xsd -->
                <configuration>
                    <sourceRoot>${project.build.directory}/generated/src/main/java</sourceRoot>
                    <xsdOptions>
                    <xsdOption>
                    <xsdDir>${project.basedir}/src/main/resources/xsd</xsdDir>
                    <bindingFile>${project.basedir}/src/main/resources/my-binding.xml</bindingFile>
                    <extensionArgs>
                        <extensionArg>-mark-generated</extensionArg>
                        <extensionArg>-Xts</extensionArg>
                        <extensionArg>-extension</extensionArg>
                        <extensionArg>-Xinheritance</extensionArg>
                    </extensionArgs>
                </xsdOption>

                <dependencies>
                    <dependency>
                        <groupId>org.jvnet.jaxb2_commons</groupId>
                        <artifactId>jaxb2-basics-runtime</artifactId>
                        <version>0.11.0</version>
                    </dependency>
                </dependencies>
            </configuration>
            <goals>
                <goal>xsdtojava</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Kelas super:

public class MyMessage {
    private String sessionID;
    //getter, setter
}

Hasil mvn generate-sources: kelas TIDAK diwariskan. Tapi saya tidak mendapatkan kesalahan. Mengapa?


person membersound    schedule 04.03.2016    source sumber
comment
Itu harus berada di bawah ikatan global sesuai Memperluas Kelas Super Umum   -  person Tunaki    schedule 04.03.2016
comment
Namun elemen apa pun dari xsd akan mendapatkan superkelas. Saya hanya ingin xs:element[@name='myRequest'] tertentu.   -  person membersound    schedule 04.03.2016
comment
Ya. Namun, seperti yang dinyatakan dalam dokumen, hal ini harus terikat secara global. Saya tidak berpikir Anda bisa melakukannya per kelas.   -  person Tunaki    schedule 04.03.2016
comment
Itu benar-benar berita buruk, tapi mungkin Anda benar dan itu tidak mungkin.   -  person membersound    schedule 04.03.2016


Jawaban (1)


Anda dapat menggunakan Plugin Warisan JAXB2 (ini memungkinkan implementasi antarmuka atau ekstensi kelas)

Menghasilkan kelas JAXB yang mengimplementasikan antarmuka

https://github.com/highsource/jaxb2-basics/wiki/JAXB2-Inheritance-Plugin

person Levijatanu    schedule 24.02.2020