【发布时间】:2011-05-28 23:36:16
【问题描述】:
我们正在使用 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;
}
更新
布莱斯已经回答了这个问题。但是,我不喜欢在 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>
【问题讨论】:
-
它甚至没有正确拼写医生,而是拼写为 physicien。奇怪。
-
XJC 实际上基于列表的元素名称,因此您可以直接调用元素名称医生。但是(这是一个很大的但是......)如果您这样做,仍然有一个怪癖,即当您使用 JAXB 重新编组对象时,每个元素都将具有复数名称“医生”。很奇怪。也就是说,我已经使用了你的方法,而且效果很好。