I've been debugging this morning and have made the same progress as you.
I'm pretty certain that extraClass isn't used and that getPackageContext()
might be the key to this.


Here's my stacktrace:
(IRenvelope is one of the inner classes contained by the main
GovTalkMessage class and has a different namespace)

[javax.xml.bind.JAXBException: class com.mycompany.util.hmrc.mov.IRenvelope
nor any of its super class is known to this context.]
    at
com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:326)
    at
com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:251)
    at
javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:110)
    at
org.apache.cxf.jaxrs.provider.JAXBElementProvider.marshalToOutputStream(JAXBElementProvider.java:546)
    at
org.apache.cxf.jaxrs.provider.JAXBElementProvider.marshal(JAXBElementProvider.java:504)
    at
org.apache.cxf.jaxrs.provider.JAXBElementProvider.marshal(JAXBElementProvider.java:396)
    at
org.apache.cxf.jaxrs.provider.JAXBElementProvider.writeTo(JAXBElementProvider.java:268)
    at
org.apache.cxf.jaxrs.utils.JAXRSUtils.writeMessageBody(JAXRSUtils.java:1173)
    at
org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:398)
    at
org.apache.cxf.jaxrs.client.WebClient$BodyWriter.doWriteBody(WebClient.java:1003)
    at
org.apache.cxf.jaxrs.client.AbstractClient$AbstractBodyWriter.handleMessage(AbstractClient.java:932)
    at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
    at
org.apache.cxf.jaxrs.client.AbstractClient.doRunInterceptorChain(AbstractClient.java:576)
    at
org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:893)
    at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:761)
    at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:748)
    at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:355)
    at org.apache.cxf.jaxrs.client.WebClient.post(WebClient.java:381)



On 4 December 2012 10:09, Sergey Beryozkin <[email protected]> wrote:

> On 03/12/12 19:11, Gareth Hughes wrote:
>
>> No they are not interfaces. They are all xjc generated classes from
>> schemas.
>> I'm pretty sure that the jaxb provider is not using the extra class
>> settings but am at home and will provide more detail tomorrow. Where could
>> I debug to see it in action decoding a response back to my object?
>>
>
> Sure, try org.apache.cxf.jaxrs.provider.**AbstractJAXBProvider#**
> getClassContext
>
> Actually, I wonder, is that code actually used or not.
>
> Do you have ObjectFactory somewhere ? I'll experiment at my end, but I can
> see now that if package-level JAXB context is created then
> AbstractJAXBProvider#**getClassContext is not called and thus
> extraClass[] is not visible...
>
> Sergey
>
>
>  Thanks
>> On 3 Dec 2012 16:54, "Sergey 
>> Beryozkin"<sberyozkin@gmail.**com<[email protected]>>
>>  wrote:
>>
>>  Hi Gareth,
>>>
>>> On 03/12/12 14:19, Gareth Hughes wrote:
>>>
>>>  Hi,
>>>>
>>>> I'm trying to avoid using @XmlSeeAlso with my WebClient for
>>>> unmarshalling
>>>> an XML Response.
>>>>
>>>> If I setup @XmlSeeAlso on my root bean then all the unmarshalling works
>>>> properly and the inner classes that use a different namespace get built
>>>> properly. But, I've been trying to do the same thing using extraClass
>>>> and
>>>> not getting it to work.
>>>>
>>>> I'd doing this with Java Spring config files.
>>>>
>>>>           JAXBElementProvider<Object>   p = new
>>>> JAXBElementProvider<Object>();
>>>>           p.setSingleJaxbContext(true);
>>>>           p.setExtraClass(new Class[]{GovTalkMessage.class,
>>>> IRenvelope.class,
>>>> ErrorResponse.class});
>>>>           List<Object>   providers = new ArrayList<Object>();
>>>>           providers.add(p);
>>>>           WebClient client = WebClient.create(URL, providers);
>>>>
>>>>
>>>> I've been diving into the code and looking at the code that uses the
>>>> extraClass. AbstractJAXBProvider.init() has
>>>>
>>>>          JAXBContext context =
>>>>                   ResourceUtils.****createJaxbContext(allTypes,
>>>> extraClass,
>>>>
>>>> cProperties);
>>>>
>>>> and allTypes is derived from the List<ClassResourceInfo>cris. If cris is
>>>> null, the context is null.
>>>>
>>>> cris ultimately comes from JAXRSClientFactoryBean classResourceInfos.
>>>>   What
>>>> should that contain?
>>>>
>>>>
>>> On the server side, and I think when using the proxy-based client code,
>>> this comes from introspecting the root resource classes, which is not
>>> available in case of WebClient.
>>>
>>> That said, setting an extraClass property alone should also work, what
>>> exactly is happening ? Do you have interfaces in the above list of
>>> classes ?
>>>
>>> thanks, Sergey
>>>
>>>
>>>  I should point out I'm using a custom outInterceptor. No other special
>>>> setup.
>>>>
>>>> many thanks for any help
>>>>
>>>> Gareth
>>>>
>>>>
>>>>
>>
>
> --
> Sergey Beryozkin
>
> Talend Community Coders
> http://coders.talend.com/
>
> Blog: http://sberyozkin.blogspot.com
>

Reply via email to