Java 绑定嵌套类,生成名为';类型';,如何防止这种情况

Java 绑定嵌套类,生成名为';类型';,如何防止这种情况,java,xml,jaxb,xjc,Java,Xml,Jaxb,Xjc,我有一个XSD(我无法更改),其中包含在complexType的序列元素中定义的以下元素: <xsd:element minOccurs="0" name="precision" nillable="true"> <xsd:complexType> ... </xsd:complexType> </xsd:element> <xsd:element minOccurs="0"

我有一个XSD(我无法更改),其中包含在complexType的序列元素中定义的以下元素:

<xsd:element minOccurs="0" name="precision" nillable="true">
      <xsd:complexType>
                   ...
      </xsd:complexType>
 </xsd:element>
 <xsd:element minOccurs="0" name="Precision" nillable="true">
      <xsd:complexType>
                    ...
      </xsd:complexType>
 </xsd:element>          

...
...
在模式上运行xjc时,ObjectFactory和嵌套类中的名称冲突会导致异常

为了解决此问题,我添加了此外部绑定,用于将字段映射到唯一名称,并将类映射到唯一名称:

<jaxb:bindings node="//*[local-name()='element' and @name='precision']" schemaLocation="schema.xsd">
    <jaxb:property name="precision1"/>
    <jaxb:class name="precision1"/>
</jaxb:bindings>
<jaxb:bindings node="//*[local-name()='element' and @name='Precision']" schemaLocation="schema.xsd">
    <jaxb:property name="Precision2"/>
    <jaxb:class name="Precision2"/>
</jaxb:bindings>

这允许生成JAXB类,但类的生成方式如下:

 @XmlElementRef(name = "precision1", namespace = "namespace.CustomerInvoice2", type = JAXBElement.class, required = false)
protected JAXBElement<CustomerOrderDate.Precision1> precision1;

    protected final static QName NAME = new QName("namespace.CustomerInvoice3", "precision");

    public Precision11(CustomerOrderDate.Precision11 .Type value) {
        super(NAME, ((Class) CustomerOrderDate.Precision11 .Type.class), CustomerOrderDate.class, value);
    }

    public Precision11() {
        super(NAME, ((Class) CustomerOrderDate.Precision11 .Type.class), CustomerOrderDate.class, null);
    }


    /**
     * whole bunch of comments...
     */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "precision",
        "use"
    })
    public static class Type {
         //The actual fields
@xmlementref(name=“precision1”,namespace=“namespace.CustomerInvoice2”,type=JAXBElement.class,required=false)
保护带精度1;
受保护的最终静态QName名称=新QName(“namespace.CustomerInvoice3”,“precision”);
公共精度11(CustomerOrderDate.Precision11.Type值){
super(名称,((类)CustomerOrderDate.Precision11.Type.Class),CustomerOrderDate.Class,值);
}
公共行政11(){
super(名称,((类)CustomerOrderDate.Precision11.Type.Class),CustomerOrderDate.Class,null);
}
/**
*一大堆评论。。。
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=),比例={
“精确”,
“使用”
})
公共静态类类型{
//实际字段
但是,如果我手动将字段名更改为precision1和Precision2,则类将生成为:

 public static class Precision1 {

    @XmlElementRef(name = "precision", namespace = "namespace.CustomerInvoice2", type = JAXBElement.class, required = false)
    protected JAXBElement<Integer> precision;
    @XmlElementRef(name = "use", namespace = "namespace.CustomerInvoice2", type = JAXBElement.class, required = false)
    protected JAXBElement<String> use;
    @XmlAttribute(name = "mark")
    protected String mark;
    @XmlAttribute(name = "mode")
    protected String mode;
    @XmlAttribute(name = "invalid")
    protected Boolean invalid;
    // blah, blah, blah...
公共静态类精度1{
@xmlementref(name=“precision”,namespace=“namespace.CustomerInvoice2”,type=JAXBElement.class,required=false)
保护测量精度;
@xmlementref(name=“use”,namespace=“namespace.CustomerInvoice2”,type=JAXBElement.class,required=false)
保护性使用;
@xmltattribute(name=“mark”)
受保护的字符串标记;
@xmltattribute(name=“mode”)
保护字符串模式;
@XmlAttribute(name=“无效”)
受保护布尔值无效;
//废话,废话,废话。。。
我很好奇是否有一个绑定可以用于将QName值保留在根类的字段声明中,并将类型信息保留在生成的类中。

基于和教程

您只需要:

<jaxb:bindings node="//xs:element[@name='precision']/xs:complexType" schemaLocation="schema.xsd">
    <jaxb:class name="Precision1"/>
</jaxb:bindings>
<jaxb:bindings node="//xs:element[@name='Precision']/xs:complexType" schemaLocation="schema.xsd">
    <jaxb:class name="Precision2"/>
</jaxb:bindings>


有效吗?@Edwardth-是的!这似乎起到了作用。我的理解正确吗,我将把匿名complexType本身映射到一个新名称,而不是告诉xjc将元素转换为类?据我所知,xjc必须将
complexType
映射到一个类,而不是
el水泥