如何使用JAXB生成一个从xsd实现Serializable接口的Java类?

Bor*_*vić 45 java xsd jaxb xjc

我想在现有的Spring项目中引入缓存,该项目使用JAXB来公开WebServices.缓存将在端点级别完成.为了做到这一点,使用JAXB从XSD生成的类需要实现Serializable接口和覆盖ObjecttoString()方法.

如何使用XSD指示xjc工具生成具有所需属性的源?

Pas*_*ent 76

序列化

使用xjc:serializable在自定义绑定文件的添加java.io.Serializable界面沿着你的类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> 
Run Code Online (Sandbox Code Playgroud)

的toString()

使用超类(请参阅参考资料xjc:superClass)从中继承所有绑定类.xjc不会生成此类,因此您可以随意创建它(这里有一个toString()实现):

<?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>
Run Code Online (Sandbox Code Playgroud)

  • 在应用`<xjc:superClass ...>`后,我得到`@XmlValue不允许在派生另一个类的类上.解决方案是:将`@javax.xml.bind.annotation.XmlTransient`注释添加到基类(请参阅此处:http://sites.google.com/site/codingkb/java-2/jaxb/jaxb-4) (4认同)
  • 谢谢你的回答.你会根据反射使用apache commons来源ToStringBuilder的toString构建器吗? (2认同)

vik*_*eve 7

这对我有用:

<?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>
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.


art*_*spb 5

另一种生成toString()方法的方法--JAXB2 Basics插件.这种方式看起来更好,因为不使用反射.示例如何使用下面的maven来完成它.

<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>
Run Code Online (Sandbox Code Playgroud)

结果你会得到这样的代码.

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;
}
Run Code Online (Sandbox Code Playgroud)