Je voudrais introduire la mise en cache dans un projet Spring existant qui utilise JAXB pour exposer les WebServices. La mise en cache se fera au niveau des points finaux. Pour ce faire, les classes générées à partir de XSD à l'aide de JAXB doivent implémenter l'interface Serializable
et remplacer la méthode toString()
de Object
.
Comment demander à l'outil xjc d'utiliser XSD pour générer une source avec les propriétés nécessaires?
Utilisez xjc:serializable
Dans un fichier de liaisons personnalisé pour ajouter l'interface Java.io.Serializable
À vos classes avec un 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>
Utilisez une superclasse (voir xjc:superClass
) Dont toutes vos classes liées hériteront. Cette classe ne sera pas générée par xjc, vous êtes donc libre de la créer à votre guise (ici avec une implémentation 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>
Cela a fonctionné pour moi:
<?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>
J'espère que cela aide.
Une autre façon de générer la méthode toString()
- JAXB2 Basics Plugins . De cette façon, c'est mieux car n'utilise pas la réflexion. Exemple comment le faire avec maven ci-dessous.
<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>
En conséquence, vous obtiendrez un tel 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;
}
j'utilise ce code et travaille pour moi
<?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>
Et voici un exemple utilisant CXF 3.1.10. N'oubliez pas d'inclure le groupe de compilation: 'org.Apache.cxf.xjc-utils', nom: '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>
afin d'obtenir l'interface sérialisable, ajoutez les informations de liaison suivantes au fichier 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>