We are using JAXB to generate Java classes and have encountered a few cases where generated plural method names are not correct. For example, where we expect getPhysicians
we are getting getPhysicien
. How would we customize how JAXB pluralizes specific methods?
The schema:
<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>
The generated Java code:
... public class PhysicianList { ... @XmlElement(name = "Physician") protected List<Physician> physicien; ... public List<Physician> getPhysicien() { if (physicien == null) { physicien = new ArrayList<Physician>(); } return this.physicien; }
Update
This has been answered by Blaise. However, I prefer not mixing concerns such as JAXB customizations in an XML schema. So for those of you with the same preference, here is a JAXB binding file that achieves the same thing as what Blaise suggested, keeping JAXB customization out of the schema:
<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>
Open a command prompt. Run the JAXB schema compiler, xjc command from the directory where the schema file is located. The xjc schema compiler tool is located in the app_server_root \bin\ directory. Use the generated JAXB objects within a Java application to manipulate XML content through the generated JAXB classes.
xjb extension to resolve any conflicts in the WSDL or schema. For example if two elements have the same name and you want to distinguish between them you can rename one by specifying it the bindings file.
By default the following is generated for your schema fragment:
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; } }
If you annotate your XML schema:
<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>
Then you can generate the desired class:
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; } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With