Java 如何定制JAXB如何生成复数方法名?
我们正在使用JAXB生成Java类,并且遇到了一些生成的复数方法名称不正确的情况。例如,当我们期望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
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>
参考资料:
- (编辑:过时链接)
- (新链接)