JAXB compiler is binding xs:boolean to Java Boolean wrapper class, instead of boolean primitive type JAXB compiler is binding xs:boolean to Java Boolean wrapper class, instead of boolean primitive type xml xml

JAXB compiler is binding xs:boolean to Java Boolean wrapper class, instead of boolean primitive type


Problem

The reason you are getting Boolean instead of boolean is that you have minOccurs="0" in your element definition. A null value will be stored for an absent element.

<xs:element name="pricepoint_custom_fields_required" type="xs:boolean" minOccurs="0"/>

What the Solution Should Be

The solution should be an external binding file that indicates that a primitive type should be used for optional values (see section 7.5.1 of the JAXB 2.2 specification).

<?xml version="1.0" encoding="UTF-8"?><jaxb:bindings    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"    version="2.1">    <jaxb:globalBindings optionalProperty="primitive"/></jaxb:bindings>

The external binding file is specified using the -b option with XJC.

xjc -b binding.xml my-schema.xsd

Why That Solution Does Not Work

The following bugs have been opened to track the issue with optionalProperty="primitive".

Workaround

If you don't like the way a class is generated in JAXB, then you can create a class yourself and have JAXB pull it in as part of the schema to class generation.

binding.xml

<jxb:bindings     xmlns:xs="http://www.w3.org/2001/XMLSchema"    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"    version="2.1">    <jxb:bindings schemaLocation="my-schema.xsd">        <jxb:bindings node="//xs:element[@name='usage-auth-rate-charge']/complexType">            <jxb:class ref="com.example.foo.UsageAuthRateCharge"/>        </jxb:bindings>    </jxb:bindings></jxb:bindings>

UsageAuthRateCharge

Create this class with the methods as you want them.

XJC Call

Use the -b flag on the XJC call to specify the binding.xml file

xjc -b binding.xml my-schema.xsd

UPDATE

What I was really hoping was that one of the readers might be a jaxb dev team member who could do the change easily in jaxb. User archenroot offered a possible solution in his comments on jaxb issue 927 (a duplicate of 926) which leads me to think that for the right person, it would be a simple job to fix jaxb

I'm the EclipseLink JAXB (MOXy) lead. I have reached out to my colleagues who do the JAXB reference implementation (they also work for Oracle). Below is the reply I got from them:

I’ve tested in trunk - and the problem exists. I’ll check code how easy is to fix it.

Hopefully you will be able to get a real fix for this issue.


Try this...

<xs:element name="usage-auth-rate-charge">    <xs:complexType>        <xs:sequence>            <xs:element name="service-id" type="xs:string"/>        </xs:sequence>        <xs:attribute name="chosen" type="xs:boolean" use="required"/>    </xs:complexType></xs:element>

I found your question as I was looking how to do the exact opposite thing you were doing. I had a boolean attribute that would only generate code that had the attribute as a primitive boolean value. To make jaxb generate this attribute as a Boolean object instead of a boolean primitive, I just removed the use="required" portion of my attribute's definition in the xsd.


Just to make it complete

type="xs:boolean" minOccurs="0" maxOccurs="1"                   == Boolean value (object)type="xs:boolean" minOccurs="0" maxOccurs="1" nillable="true"   == JAXBElement<Boolean> value (object)type="xs:boolean" minOccurs="1" maxOccurs="1"                   == boolean value (primitive)type="xs:boolean" minOccurs="1" maxOccurs="1" nillable="true"   == Boolean value (object)