How to generate a Java class which implements Serializable interface from xsd using JAXB?

后端 未结 6 1815
陌清茗
陌清茗 2020-11-28 07:20

I would like to introduce caching into an existing Spring project which uses JAXB to expose WebServices. Caching will be done on the level of end points. In order to do that

相关标签:
6条回答
  • 2020-11-28 07:49

    i use this code and is work for me

    <?xml version="1.0" encoding="UTF-8"?>
    <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:version="2.1">
        <jaxb:globalBindings>
            <xjc:serializable uid="1"/><!--If you Forgot this line your class did not be serializable--!>
        </jaxb:globalBindings>
    </jaxb:bindings>
    
    0 讨论(0)
  • 2020-11-28 07:53

    Serializable

    Use xjc:serializable in a custom bindings file to add the java.io.Serializable interface to your classes along with a serialVersionUID:

    <?xml version="1.0" encoding="UTF-8"?>
    <bindings xmlns="http://java.sun.com/xml/ns/jaxb"
                xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
                xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
                xsi:schemaLocation="
    http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
    version="2.1">
      <globalBindings>
        <serializable uid="1" />
      </globalBindings>
    </bindings> 
    

    toString()

    Use a superclass (see xjc:superClass) from which all your bound classes will inherit. This class won’t be generated by xjc so you are free to create it as you please (here with a toString() implementation):

    <?xml version="1.0" encoding="UTF-8"?>
    <bindings xmlns="http://java.sun.com/xml/ns/jaxb"
                    xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
                    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
                    xsi:schemaLocation="
    http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
        version="2.1">
        <globalBindings>
            <serializable uid="1" />
            <xjc:superClass name="the.package.to.my.XmlSuperClass" />
        </globalBindings>
    </bindings>
    
    0 讨论(0)
  • 2020-11-28 08:01

    This worked for me:

    <?xml version="1.0" encoding="UTF-8"?>
    <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:version="2.1">
        <jaxb:globalBindings>
            <xjc:serializable uid="1337"/>
        </jaxb:globalBindings>
    </jaxb:bindings>
    
    0 讨论(0)
  • 2020-11-28 08:03

    in order to get interface Serializable add following binding information to the xsd-file:

    <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"> <xs:annotation> <xs:appinfo> <jaxb:globalBindings optionalProperty="primitive"> <jaxb:serializable/> </jaxb:globalBindings> </xs:appinfo> </xs:annotation> <xs:element name="myXsdElement"> ..... </xs:element> </xs:schema>

    0 讨论(0)
  • 2020-11-28 08:06

    And here is a sample using CXF 3.1.10. Remember to include compile group: 'org.apache.cxf.xjc-utils', name: 'cxf-xjc-runtime', version: '3.1.0'

    <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="META-INF/wsdl/xsd2.xsd">
    
            <jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
                    <jxb:serializable uid="1"/>
                  </jxb:globalBindings>
    
    0 讨论(0)
  • 2020-11-28 08:08

    Another way to generate toString() method - JAXB2 Basics Plugins. This way looks better because doesn't use reflection. Example how to do it with maven below.

    <build>
        <plugins>
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.8.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <schemaDirectory>
                        ${project.basedir}/src/main/resources
                    </schemaDirectory>
                    <generateDirectory>
                        ${project.basedir}/src/main/java
                    </generateDirectory>
                    <extension>true</extension>
                    <args>
                        <arg>-XtoString</arg>
                    </args>
                    <plugins>
                        <plugin>
                            <groupId>org.jvnet.jaxb2_commons</groupId>
                            <artifactId>jaxb2-basics</artifactId>
                            <version>0.6.4</version>
                        </plugin>
                    </plugins>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
    <dependencies>
        <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-basics-runtime</artifactId>
            <version>0.6.4</version>
        </dependency>
    </dependencies>
    

    As the result you'll get such code.

    public String toString() {
        final ToStringStrategy strategy = JAXBToStringStrategy.INSTANCE;
        final StringBuilder buffer = new StringBuilder();
        append(null, buffer, strategy);
        return buffer.toString();
    }
    
    public StringBuilder append(ObjectLocator locator, StringBuilder buffer, ToStringStrategy strategy) {
        strategy.appendStart(locator, this, buffer);
        appendFields(locator, buffer, strategy);
        strategy.appendEnd(locator, this, buffer);
        return buffer;
    }
    
    public StringBuilder appendFields(ObjectLocator locator, StringBuilder buffer, ToStringStrategy strategy) {
        {
            String theName;
            theName = this.getName();
            strategy.appendField(locator, this, "name", buffer, theName);
        }
        {
            String theBank;
            theBank = this.getBank();
            strategy.appendField(locator, this, "bank", buffer, theBank);
        }
        return buffer;
    }
    
    0 讨论(0)
提交回复
热议问题