Make JAXB XJC create a packing class for a simple type

I have the following xml types:

<xsd:element name="FaxNumbers" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element name="FaxNumber" type="FaxNumber" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> 

The FaxNumber type is as follows:

 <xsd:simpleType name="FaxNumber"> <xsd:restriction base="xsd:string"> <xsd:minLength value="1" /> </xsd:restriction> </xsd:simpleType> 

The resulting xml should look something like this:

 <FaxNumbers> <FaxNumber>3878374</FaxNumber> <FaxNumber>387833434</FaxNumber> <FaxNumber>3878334</FaxNumber> </FaxNumbers> 

When running JAXB XJC to generate Java classes from XSD, it generates the following class:

 @XmlType(name = "FaxNumbers") public class FaxNumbers { /** * No comment. */ @XmlElement(name = "FaxNumber", required = true) protected List<String> faxNumber = new ArrayList<String>(); } 

However, I would like to bind FaxNumber to a composite class as follows:

 @XmlType(name = "FaxNumbers") public class FaxNumbers { /** * No comment. */ @XmlElement(name = "FaxNumber", required = true) protected List<FaxNumber> faxNumber = new ArrayList<String>(); } Where FaxNumber class looks like this: public class FaxNumber{ @XmlValue private String value; } 

Is there any way to define such binding in JAXB xml bindings?

Note. Unfortunately, I have no control and can not change the XSD

+8
java jaxb xjc
source share
3 answers

I don’t think that you can get xjc to create such a FaxNumber class for you, but you can write it yourself and then use an external binding file to put it in the right place.

 package com.example; public class FaxNumber { private String value; // getter/setter public static FaxNumber parse(String s) { FaxNumber n = new FaxNumber(); n.value = s; return n; } public static String print(FaxNumber n) { return n.value; } } 

Handcuffs:

 <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0"> <jaxb:bindings schemaLocation="example.xsd"> <jaxb:bindings node="//xsd:simpleType[@name='FaxNumber']"> <jaxb:javaType name="com.example.FaxNumber" parseMethod="com.example.FaxNumber.parse" printMethod="com.example.FaxNumber.print"/> </jaxb:bindings> </jaxb:bindings> <jaxb:bindings> 
+6
source share

instead of the line <xsd:element name="FaxNumber" type="FaxNumber" maxOccurs="unbounded" /> in your xsd fax definition use <xsd:element name="FaxNumber" ref="FaxNumber" maxOccurs="unbounded" /> . I think this is your problem.

+1
source share

The following works for me. Hope this helps!

Xsd

  <xsd:schema xmlns="http://www.hcentive.com/ws/eligibility/schema/beans" targetNamespace="http://www.hcentive.com/ws/eligibility/schema/beans" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="FaxNumbers"> <xsd:complexType> <xsd:sequence> <xsd:element name="FaxNumber" type="FaxNumber" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="FaxNumber"> <xsd:sequence> <xsd:element type="xsd:string" name="value" /> </xsd:sequence> </xsd:complexType> </xsd:schema> 

Generated Object: FaxNumbers.java

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "faxNumber" }) @XmlRootElement(name = "FaxNumbers") public class FaxNumbers { @XmlElement(name = "FaxNumber", required = true) protected List<FaxNumber> faxNumber; /** * Gets the value of the faxNumber property. * * <p> * This accessor method returns a reference to the live list, * not a snapshot. Therefore any modification you make to the * returned list will be present inside the JAXB object. * This is why there is not a <CODE>set</CODE> method for the faxNumber property. * * <p> * For example, to add a new item, do as follows: * <pre> * getFaxNumber().add(newItem); * </pre> * * * <p> * Objects of the following type(s) are allowed in the list * {@link FaxNumber } * * */ public List<FaxNumber> getFaxNumber() { if (faxNumber == null) { faxNumber = new ArrayList<FaxNumber>(); } return this.faxNumber; } } 
+1
source share

All Articles