Upstream Jira link: https://java.net/jira/browse/JAXB-1028 Given the following schema: <xs:schema xmlns:tns="http://jaxb.gss.redhat.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://jaxb.gss.redhat.com/"> <xs:element name="team" type="tns:team"/> <xs:complexType name="team"> <xs:sequence> <xs:element ref="tns:abstractName"/> <xs:element ref="tns:member"/> </xs:sequence> </xs:complexType> <xs:element abstract="true" name="abstractName" nillable="false"/> <xs:element abstract="false" name="name" nillable="true" substitutionGroup="tns:abstractName" type="xs:string"/> <xs:element abstract="true" name="member" nillable="false"/> <xs:element abstract="false" name="programmer" nillable="true" substitutionGroup="tns:member" type="xs:string"/> </xs:schema> And the following XML: <team xmlns="http://jaxb.gss.redhat.com/"> <name xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> <programmer>Kyle</programmer> </team> A JAXB unmarshaller will mark the <programmer> element as nil, yet still have the value of "Kyle" associated with the JAXBElement. Code to test: package com.redhat.gss.jaxb; import java.net.URL; import javax.xml.bind.Unmarshaller; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; public class Test { private static JAXBContext ctx = null; public static void main(String[] args) throws Exception { ctx = JAXBContext.newInstance(ObjectFactory.class, Team.class, String.class); URL inputUrl = Test.class.getResource("/no-nil.xml"); System.out.println("Non-nil test."); doTest(inputUrl); System.out.println("\nNil test. Member should NOT be nil"); inputUrl = Test.class.getResource("/nil.xml"); doTest(inputUrl); } public static void doTest(URL inputUrl) throws Exception { Unmarshaller unm = ctx.createUnmarshaller(); Object o = unm.unmarshal(inputUrl); Team team = ((JAXBElement<Team>)o).getValue(); System.out.println("Name: " + team.getAbstractName().getValue()); System.out.println("Name nil? " + (team.getAbstractName().isNil() ? "YES" : "NO")); System.out.println("Member: " + team.getMember().getValue()); System.out.println("Member nil? " + (team.getMember().isNil() ? "YES" : "NO")); } }
Verified on 6.3.1.CP.CR1