J'utilise le plugin Maven Maven-Jaxb2-plugin pour générer des pojos à partir d'un fichier de schéma XSD. Cela fonctionne bien. La seule chose qui me dérange vraiment est que les énumérations de schéma XML ne sont pas mappées dans un Java Enum Type.
Mon plugin maven génère le Java pojos d'un fichier que j'ai appelé schemachooser.xsd
schemachooser.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sch="http://www.ascc.net/xml/schematron"
targetNamespace="http://schema.something" elementFormDefault="qualified"
version="1.0" xmlns:jaxb="http://Java.Sun.com/xml/ns/jaxb" xmlns:xjc="http://Java.Sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc" jaxb:version="1.0">
<xs:annotation>
<xs:appinfo>
<jaxb:globalBindings generateIsSetMethod="true" fixedAttributeAsConstantProperty="true">
<xjc:serializable />
</jaxb:globalBindings>
<jaxb:schemaBindings>
<jaxb:bindings node="//xsd:element[@name='ElementName']/xsd:simpleType">
<jaxb:typesafeEnumClass name="MyEnumType" />
</jaxb:bindings>
</jaxb:schemaBindings>
</xs:appinfo>
</xs:annotation>
<xs:include schemaLocation="myNormalSchema.xsd" />
</schema>
Il génère les fichiers, mais pas la "nouvelle" classe Enum "myenumumType". Suis-je en train d'utiliser les liaisons incorrectes?
Si vous souhaitez conserver les annotations JAXB séparées du schéma XML, vous devez utiliser un fichier de liaison JAXB:
liaisons.xml
<jaxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://Java.Sun.com/xml/ns/jaxb"
xmlns:xjc="http://Java.Sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc"
version="2.1">
<jaxb:globalBindings generateIsSetMethod="true" fixedAttributeAsConstantProperty="true">
<xjc:serializable />
</jaxb:globalBindings>
<jaxb:bindings schemaLocation="myNormalSchema.xsd">
<jaxb:bindings node="//xs:element[@name='ElementName']/xs:simpleType">
<jaxb:typesafeEnumClass name="MyEnumType" />
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
mynormalalschema.xsd
Vous trouverez ci-dessous un exemple de schéma XML qui a été inverse de votre question:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
targetNamespace="http://www.example.com"
xmlns="http://www.example.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ElementName">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="MY_ENUM_1"/>
<xs:enumeration value="MY_ENUM_2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element ref="ElementName"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Appel XJC
xjc -extension -d out -b bindings.xml myNormalSchema.xsd
myENUMUMTYPE
L'une des classes générées est une énumération appelée MyEnumType
.
package com.example;
import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlType;
@XmlType(name = "")
@XmlEnum
public enum MyEnumType {
MY_ENUM_1,
MY_ENUM_2;
public String value() {
return name();
}
public static MyEnumType fromValue(String v) {
return valueOf(v);
}
}
root
De plus, la classe racine est générée avec la méthode isSet
:
package com.example;
import Java.io.Serializable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"elementName"
})
@XmlRootElement(name = "Root")
public class Root
implements Serializable
{
@XmlElement(name = "ElementName", required = true)
protected MyEnumType elementName;
public MyEnumType getElementName() {
return elementName;
}
public void setElementName(MyEnumType value) {
this.elementName = value;
}
public boolean isSetElementName() {
return (this.elementName!= null);
}
}
Exemples