Javaクラスを生成するためにJAXBを使用しており、生成された複数のメソッド名が正しくない場合がいくつかあります。たとえば、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のカスタマイズなどの懸念事項を混在させることは好みません。同じ設定をお持ちの方のために、Blaiseの提案と同じことを実現するJAXBバインディングファイルを以下に示します。これにより、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>
デフォルトでは、スキーマフラグメントに対して以下が生成されます。
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;
}
}
答えが少し遅いかもしれませんが、複数の名前を単純に生成する別の方法があります混合せずに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>
参照: