Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you customize how JAXB generates plural method names?

Tags:

java

xml

jaxb

jaxb2

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> 
like image 404
SingleShot Avatar asked Dec 21 '10 17:12

SingleShot


People also ask

How do you auto generate JAXB classes?

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.

What is XJB file in JAXB?

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.


1 Answers

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;     }  } 
like image 139
bdoughan Avatar answered Oct 05 '22 14:10

bdoughan