JAXBを使用してWebServicesを公開する既存のSpringプロジェクトにキャッシュを導入したいと思います。キャッシングはエンドポイントのレベルで行われます。 JAXBを使用してXSDから生成されたクラスを実行するには、Serializable
インターフェイスを実装し、Object
のtoString()
メソッドをオーバーライドする必要があります。
XSDを使用してxjcツールに指示して、必要なプロパティを持つソースを生成するにはどうすればよいですか?
カスタムバインディングファイルで_xjc:serializable
_を使用して、serialVersionUID
とともに_Java.io.Serializable
_インターフェイスをクラスに追加します。
_<?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>
_
すべてのバインドクラスが継承するスーパークラス(_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>
_
これは私のために働いた:
<?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>
それが役に立てば幸い。
toString()
メソッドを生成する別の方法- JAXB2 Basics Plugins 。この方法は、反射を使用しないため、見栄えがよくなります。以下に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>
その結果、このようなコードを取得できます。
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;
}
私はこのコードを使用し、私のために働いています
<?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>
そして、これはCXF 3.1.10を使用したサンプルです。コンパイルグループを含めることを忘れないでください: 'org.Apache.cxf.xjc-utils'、名前: 'cxf-xjc-runtime'、バージョン: '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>
インターフェースSerializableを取得するには、次のバインディング情報をxsdファイルに追加します。
<?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>