问题
I have to use a schema which contains the following snippet where the name object
is duplicated.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="param_object_type">
<xs:sequence>
<xs:element name="object" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="object" minOccurs="0" maxOccurs="unbounded">
</xs:sequence>
</xs:complexType>
</xs:sequence>
</xs:complexType>
</xs:schema>
Jaxb was originally happy to import this, but would fail to compile the sources since the Object class was declared twice.
I added globalBindings
option localScoping="toplevel"
and this now leads to the following compile time error:
org.xml.sax.SAXParseException; systemId: A class/interface with the same name "jaxb.Object" is already in use. Use a class customization to resolve this conflict.
So I tried adding a custom binding to rename one of the objects, jaxb:class
and jaxb:property
. Both produce the same error.
If it helps, here is my bindings file:
<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jaxb:bindings>
<jaxb:globalBindings generateElementProperty="false" fixedAttributeAsConstantProperty="true" choiceContentProperty="true" localScoping="toplevel"/>
</jaxb:bindings>
<jaxb:bindings schemaLocation="../xsd/NodeSchema.xsd" node="/xs:schema">
<jaxb:bindings node="/xs:schema/xs:complexType[@name='param_object_type']/xs:sequence/xs:element[@name='object']">
<jaxb:class name="object2"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
How can I make sure that one of these instances gets renamed and the other is left intact?
回答1:
Right complex type .. missing close tag for xs:element
XSD
<xs:complexType name="param_object_type">
<xs:sequence>
<xs:element name="object" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="object" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
Bindings
<jxb:bindings node="//xs:schema//xs:complexType[@name='param_object_type']//xs:sequence//xs:element[@name='object']//xs:complexType//xs:sequence//xs:element[@name='object']">
<jxb:class name="object2" />
</jxb:bindings>
ParamObjectType.java
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "param_object_type", propOrder = {
"object"
})
public class ParamObjectType
implements Serializable
{
private final static long serialVersionUID = 2L;
protected List<ParamObjectType.Object> object;
/**
* Gets the value of the object property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the object property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getObject().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link ParamObjectType.Object }
*
*
*/
public List<ParamObjectType.Object> getObject() {
if (object == null) {
object = new ArrayList<ParamObjectType.Object>();
}
return this.object;
}
/**
* <p>Classe Java per anonymous complex type.
*
* <p>Il seguente frammento di schema specifica il contenuto previsto contenuto in questa classe.
*
* <pre>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="object" type="{http://www.w3.org/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"object"
})
public static class Object
implements Serializable
{
private final static long serialVersionUID = 2L;
@XmlElementRef(name = "object", type = ParamObjectType.Object.Object2 .class, required = false)
protected List<ParamObjectType.Object.Object2> object;
/**
* Gets the value of the object property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the object property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getObject().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link ParamObjectType.Object.Object2 }
*
*
*/
public List<ParamObjectType.Object.Object2> getObject() {
if (object == null) {
object = new ArrayList<ParamObjectType.Object.Object2>();
}
return this.object;
}
public static class Object2
extends JAXBElement<java.lang.Object>
{
protected final static QName NAME = new QName("", "object");
public Object2(java.lang.Object value) {
super(NAME, ((Class) java.lang.Object.class), ParamObjectType.Object.class, value);
}
public Object2() {
super(NAME, ((Class) java.lang.Object.class), ParamObjectType.Object.class, null);
}
}
}
}
来源:https://stackoverflow.com/questions/29016151/jaxb-rename-class-with-duplicate-name