You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Gareth Hughes <gv...@googlemail.com> on 2012/12/03 15:19:10 UTC
How to use extraClass with WebClient from Java Spring config
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?
I should point out I'm using a custom outInterceptor. No other special
setup.
many thanks for any help
Gareth
Re: How to use extraClass with WebClient from Java Spring config
Posted by Sergey Beryozkin <sb...@gmail.com>.
On 04/12/12 15:50, Gareth Hughes wrote:
> Many thanks,
>
> but I don't see the commit against the Jira item and I don't see any
> commits on this through Fisheye. Did you commit to a Git repo and it's not
> been pulled into the SVN repo?
>
For some reasons I did not see any info there too, here is the actual
commit:
http://svn.apache.org/viewvc?rev=1416953&view=rev
Cheers, Sergey
>
>
> On 4 December 2012 14:25, Sergey Beryozkin<sb...@gmail.com> wrote:
>
>> I've done some improvements (as such merged to 2.6.x and the trunk - let
>> me know if the update is needed at 2.5.x):
>>
>> https://issues.apache.org/**jira/browse/CXF-4672<https://issues.apache.org/jira/browse/CXF-4672>
>>
>> The immediate workaround is to add a jaxb.index file and if if that does
>> not help - overriding getPackageContext same as it is done for CXF-4672
>> (should be visible from the JIRA tabs though I do not see it right now, or
>> check the source).
>>
>> After the releases (in the next few days) setting an 'extraClass' property
>> only will work for package contexts too.
>>
>> Or you can do provider.init(null) - this will also work if extraClass
>> property has been set - you'd only need to set one more property,
>> "useSingleContextForPackages" so that the single context can be associated
>> with the packages of all the involved classes early .
>>
>> HTH, Sergey
>>
>>
>> On 04/12/12 10:34, Gareth Hughes wrote:
>>
>>> 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<sberyozkin@gmail.com**>
>>> 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<
>>>>> sberyozkin@gmail.com>>
>>>>> 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
>>>>
>>>>
>>>
>>
>> --
>> Sergey Beryozkin
>>
>> Talend Community Coders
>> http://coders.talend.com/
>>
>> Blog: http://sberyozkin.blogspot.com
>>
>
Re: How to use extraClass with WebClient from Java Spring config
Posted by Gareth Hughes <gv...@googlemail.com>.
Many thanks,
but I don't see the commit against the Jira item and I don't see any
commits on this through Fisheye. Did you commit to a Git repo and it's not
been pulled into the SVN repo?
On 4 December 2012 14:25, Sergey Beryozkin <sb...@gmail.com> wrote:
> I've done some improvements (as such merged to 2.6.x and the trunk - let
> me know if the update is needed at 2.5.x):
>
> https://issues.apache.org/**jira/browse/CXF-4672<https://issues.apache.org/jira/browse/CXF-4672>
>
> The immediate workaround is to add a jaxb.index file and if if that does
> not help - overriding getPackageContext same as it is done for CXF-4672
> (should be visible from the JIRA tabs though I do not see it right now, or
> check the source).
>
> After the releases (in the next few days) setting an 'extraClass' property
> only will work for package contexts too.
>
> Or you can do provider.init(null) - this will also work if extraClass
> property has been set - you'd only need to set one more property,
> "useSingleContextForPackages" so that the single context can be associated
> with the packages of all the involved classes early .
>
> HTH, Sergey
>
>
> On 04/12/12 10:34, Gareth Hughes wrote:
>
>> 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<sberyozkin@gmail.com**>
>> 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<
>>>> sberyozkin@gmail.com>>
>>>> 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
>>>
>>>
>>
>
> --
> Sergey Beryozkin
>
> Talend Community Coders
> http://coders.talend.com/
>
> Blog: http://sberyozkin.blogspot.com
>
Re: How to use extraClass with WebClient from Java Spring config
Posted by Sergey Beryozkin <sb...@gmail.com>.
I've done some improvements (as such merged to 2.6.x and the trunk - let
me know if the update is needed at 2.5.x):
https://issues.apache.org/jira/browse/CXF-4672
The immediate workaround is to add a jaxb.index file and if if that does
not help - overriding getPackageContext same as it is done for CXF-4672
(should be visible from the JIRA tabs though I do not see it right now,
or check the source).
After the releases (in the next few days) setting an 'extraClass'
property only will work for package contexts too.
Or you can do provider.init(null) - this will also work if extraClass
property has been set - you'd only need to set one more property,
"useSingleContextForPackages" so that the single context can be
associated with the packages of all the involved classes early .
HTH, Sergey
On 04/12/12 10:34, Gareth Hughes wrote:
> 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<sb...@gmail.com> 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"<sb...@gmail.com>>
>>> 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
>>
>
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/
Blog: http://sberyozkin.blogspot.com
Re: How to use extraClass with WebClient from Java Spring config
Posted by Gareth Hughes <gv...@googlemail.com>.
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 <sb...@gmail.com> 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"<sb...@gmail.com>>
>> 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
>
Re: How to use extraClass with WebClient from Java Spring config
Posted by Sergey Beryozkin <sb...@gmail.com>.
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"<sb...@gmail.com> 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
Re: How to use extraClass with WebClient from Java Spring config
Posted by Gareth Hughes <gv...@googlemail.com>.
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?
Thanks
On 3 Dec 2012 16:54, "Sergey Beryozkin" <sb...@gmail.com> 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
>>
>>
Re: How to use extraClass with WebClient from Java Spring config
Posted by Sergey Beryozkin <sb...@gmail.com>.
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
>