我们正在使用JAXB生成Java类,并且遇到了一些生成的多个方法名称不正确的情况。例如,我们期望getPhysicians
我们得到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>
生成的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;
}
更新
Blaise已经回答了这个问题。但是,我不希望在XML模式中混合诸如JAXB自定义之类的问题。所以对于那些具有相同偏好的人来说,这里有一个JAXB绑定文件,它实现了与Blaise建议相同的东西,使JAXB自定义不受模式影响:
<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>
答案 0 :(得分:29)
默认情况下,会为您的架构片段生成以下内容:
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;
}
}
如果您注释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;
}
}
答案 1 :(得分:12)
也许回答有点晚,但还有另一种简单生成复数名称的方法,不混合 XML Schema和JAXB Bindings。
通过将JAXB XJC绑定编译器与“-extension”模式一起使用。 需要添加自定义绑定文件,如下所示:
<?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>
参考文献: