Java 如何定制JAXB如何生成复数方法名?

Java 如何定制JAXB如何生成复数方法名?,java,xml,jaxb,jaxb2,Java,Xml,Jaxb,Jaxb2,我们正在使用JAXB生成Java类,并且遇到了一些生成的复数方法名称不正确的情况。例如,当我们期望getmedicines时,我们得到的是getPhysicien。我们如何定制JAXB如何使特定方法多样化 模式: <xs:complexType name="physician"> <xs:sequence> ... </xs:sequence> </xs:complexType> <xs:complexType

我们正在使用JAXB生成Java类,并且遇到了一些生成的复数方法名称不正确的情况。例如,当我们期望
getmedicines
时,我们得到的是
getPhysicien
。我们如何定制JAXB如何使特定方法多样化

模式:

<xs:complexType name="physician">
    <xs:sequence>
       ...
    </xs:sequence>
</xs:complexType>

<xs:complexType name="physicianList">
    <xs:sequence>
        <xs:element name="Physician"
                    type="physician"
                    minOccurs="0"
                    maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               version="2.0">

    <jaxb:bindings schemaLocation="myschema.xsd">
        <jaxb:bindings node="//xs:complexType[@name='physicianList']//xs:element[@name='Physician']">
            <jaxb:property name="physicians"/>
        </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>

...
生成的Java代码:

...
public class PhysicianList {
...

    @XmlElement(name = "Physician")
    protected List<Physician> physicien;
    ...

    public List<Physician> getPhysicien() {
        if (physicien == null) {
            physicien = new ArrayList<Physician>();
        }
        return this.physicien;
    }
。。。
公营医生名单{
...
@XmlElement(name=“医师”)
受保护名单;
...
公共列表getPhysicien(){
if(physicien==null){
physicien=newarraylist();
}
把这个还给physicien;
}

更新

Blaise已经回答了这一问题。但是,我不希望在XML模式中混用JAXB自定义之类的问题。因此,对于那些具有相同偏好的人,这里有一个JAXB绑定文件,它实现了与Blaise建议的相同的功能,将JAXB自定义排除在模式之外:

<xs:complexType name="physician">
    <xs:sequence>
       ...
    </xs:sequence>
</xs:complexType>

<xs:complexType name="physicianList">
    <xs:sequence>
        <xs:element name="Physician"
                    type="physician"
                    minOccurs="0"
                    maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               version="2.0">

    <jaxb:bindings schemaLocation="myschema.xsd">
        <jaxb:bindings node="//xs:complexType[@name='physicianList']//xs:element[@name='Physician']">
            <jaxb:property name="physicians"/>
        </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>

默认情况下,为您的架构片段生成以下内容:

    import java.util.ArrayList;
    import java.util.List;
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlType;

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "physicianList", propOrder = {
        "physician"
    })
    public class PhysicianList {

        @XmlElement(name = "Physician")
        protected List<Physician> physician;

        public List<Physician> getPhysician() {
            if (physician == null) {
                physician = new ArrayList<Physician>();
            }
            return this.physician;
        }

    }
import java.util.ArrayList;
导入java.util.List;
导入javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=“physicianList”,比例器={
“医生”
})
公营医生名单{
@XmlElement(name=“医师”)
受保护名单医生;
公开名单{
如果(医生==null){
内科医师=新ArrayList();
}
把这个还给医生;
}
}
如果对XML模式进行注释:

    <xs:schema
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        jaxb:version="2.1">

        <xs:complexType name="physician">
            <xs:sequence>
            </xs:sequence>
        </xs:complexType>

        <xs:complexType name="physicianList">
            <xs:sequence>
                <xs:element name="Physician"
                            type="physician"
                            minOccurs="0"
                            maxOccurs="unbounded">
                      <xs:annotation>
                          <xs:appinfo>
                              <jaxb:property name="physicians"/>
                          </xs:appinfo>
                      </xs:annotation>
                 </xs:element>
            </xs:sequence>
        </xs:complexType>

    </xs:schema>

然后可以生成所需的类:

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "physicianList", propOrder = {
    "physicians"
})
public class PhysicianList {

    @XmlElement(name = "Physician")
    protected List<Physician> physicians;

    public List<Physician> getPhysicians() {
        if (physicians == null) {
            physicians = new ArrayList<Physician>();
        }
        return this.physicians;
    }

}
import java.util.ArrayList;
导入java.util.List;
导入javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=“physicianList”,比例器={
“医生”
})
公营医生名单{
@XmlElement(name=“医师”)
受保护名单医生;
公开名单{
if(内科医生==null){
内科医生=新ArrayList();
}
把这个还给我;
}
}

回答这个问题可能有点晚了,但是有另一种方法可以简单地生成复数名,而不必混合XML模式和JAXB绑定

通过使用带“-extension”模式的JAXB XJC绑定编译器。 需要添加自定义绑定文件,如下所示:

<?xml version="1.0"?>
<jxb:bindings version="1.0"
              xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
              jxb:extensionBindingPrefixes="xjc">

  <jxb:globalBindings>              
    <xjc:simple/>
  </jxb:globalBindings>

</jxb:bindings>

参考资料:

  • 编辑:过时链接)
  • (新链接)

它的拼写甚至不正确,而是作为physicien.Strange.XJC,它实际上基于列表的元素名,因此您可以直接将元素名命名为medicines。但是(它是一个大但是…)如果您这样做,仍然存在一个怪癖,即当您使用JAXB重新封送对象时,每个元素都会有复数名“医师”。非常奇怪。这么说,我已经使用了您的方法,并且它在所有方面都有效。这非常有效。谢谢!仅供参考,我不喜欢在XML模式中混合JAXB自定义等问题,因此我在末尾添加了对于我的问题,请举一个使用绑定文件执行与您建议的相同操作的示例。再次感谢!我尝试了您建议的解决方案,生成的类仍然没有我想要的返回类型。我为此问了另一个问题。如果您也花时间回答此问题,我将非常感谢您的帮助。