users@jaxb.java.net

Re: NPE in marshall when an adapter returns null

From: Dmitri Colebatch <dim_at_colebatch.com>
Date: Fri, 7 Sep 2007 09:45:11 +1000

I've posted this as https://jaxb.dev.java.net/issues/show_bug.cgi?id=415

On 9/6/07, Dmitri Colebatch <dim_at_colebatch.com> wrote:
> Hi all,
>
> I've been trying to track this down for ages and I finally have a test
> case, before I submit a bug report I want to run it by the list. See
> the code below:
>
> import javax.xml.bind.annotation.adapters.XmlAdapter;
>
> public class TestAdapter extends XmlAdapter<String,String>
> {
> public String unmarshal(String v) throws Exception
> {
> return null;
> }
>
> public String marshal(String v) throws Exception
> {
> return null;
> }
> }
>
> ---
>
> @XmlRootElement
> @XmlAccessorType(XmlAccessType.FIELD)
> public class Bar
> {
> @XmlElement
> @XmlJavaTypeAdapter(TestAdapter.class)
> private String v;
>
> public Bar()
> {
> }
>
> public Bar(String v)
> {
> this.v = v;
> }
>
> public static void main(String[] args) throws Exception
> {
> Marshaller m = JAXBContext.newInstance(Bar.class).createMarshaller();
> m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
> m.marshal(new Bar("foo"), System.out);
> }
> }
>
> Running this throws a NPE (see below). The second stack trace is my
> real error and looks slightly different. These are both caused by a
> non-null bound instance being adapted to a null value.
>
> Any reason I shouldn't file this as a bug?
>
> cheers,
> dim
>
> Exception in thread "main" java.lang.NullPointerException
> at com.sun.xml.bind.v2.runtime.output.Encoded.setEscape(Encoded.java:71)
> at com.sun.xml.bind.v2.runtime.output.UTF8XmlOutput.doText(UTF8XmlOutput.java:224)
> at com.sun.xml.bind.v2.runtime.output.UTF8XmlOutput.text(UTF8XmlOutput.java:214)
> at com.sun.xml.bind.v2.runtime.output.IndentingUTF8XmlOutput.text(IndentingUTF8XmlOutput.java:115)
> at com.sun.xml.bind.v2.runtime.XMLSerializer.leafElement(XMLSerializer.java:288)
> at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$1.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:172)
> at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$1.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:171)
> at com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.writeLeafElement(TransducedAccessor.java:206)
> at com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:62)
> at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:293)
> at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:506)
> at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:283)
> at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:455)
> at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:292)
> at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:221)
> at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:70)
> at com.toyota.dim.jaxb.npetest.Bar.main(Bar.java:32)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:585)
> at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
>
> Note that I have a very similar NPE which I believe is caused by the same thing:
>
> Exception in thread "main" java.lang.NullPointerException
> at com.sun.xml.bind.v2.runtime.output.SAXOutput.text(SAXOutput.java:114)
> at com.sun.xml.bind.v2.runtime.XMLSerializer.leafElement(XMLSerializer.java:303)
> at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$1.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:172)
> at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$1.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:171)
> at com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.writeLeafElement(TransducedAccessor.java:214)
> at com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:62)
> at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:286)
> at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:283)
> at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:283)
> at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:663)
> at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:29)
> at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:132)
> at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:101)
> at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:286)
> at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:571)
> at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:276)
> at com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:78)
> at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:101)
> at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:286)
> at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:663)
> at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:113)
> at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:286)
> at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:663)
> at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:113)
> at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:120)
> at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:149)
> at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:269)
> at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:276)
> at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:35)
> at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:472)
> at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:301)
> at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:230)
> at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:96)
> at com.toyota.ibus.common.ws.SOAPMessage.stringify(SOAPMessage.java:560)
> at com.toyota.ibus.common.ws.SOAPMessage12.stringify(SOAPMessage12.java:81)
> at com.toyota.ibus.common.ws.WebServiceInvoker.invoke(WebServiceInvoker.java:124)
> at com.toyota.ibus.common.ws.WebServiceInvoker.invoke(WebServiceInvoker.java:91)
> at com.toyota.ibus.common.ws.WebServiceInvoker.invoke(WebServiceInvoker.java:70)
> at au.com.toyota.taipan.supplier.orders.ws.Scratch.send(Scratch.java:102)
> at au.com.toyota.taipan.supplier.orders.ws.Scratch.testDatabaseOrders(Scratch.java:128)
> at au.com.toyota.taipan.supplier.orders.ws.Scratch.main(Scratch.java:50)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:585)
> at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
>