On Thursday, January 26, 2012 1:33:24 PM rouble wrote:
> Hi Daniel,
>
> In this case FOO and bar, have _identical_ annotations. From what we can
> tell, the difference in case, is creating the different behavior.
No idea then. Any chance you could create a small testcase and attach to a
JIRA?
Dan
>
> Also, I switched out the CXF 2.4.3 to use CXF 2.4.1's JAXB jars, and the
> problem still exists.
>
> @XmlRootElement(name = "Bar")
> @XmlAccessorType(XmlAccessType.PROPERTY)
> @XmlType(name = "Bar")
> public class Bar {
> private int intBar;
>
> public int getIntBar() {
> return intBar;
> }
>
> public void setIntBar(int intBar) {
> this.intBar = intBar;
> }
> }
>
> @XmlRootElement(name = "FOO")
> @XmlAccessorType(XmlAccessType.PROPERTY)
> @XmlType(name = "FOO")
> public class FOO {
>
> private int fooInt;
>
> public int getFooInt() {
> return fooInt;
> }
>
> public void setFooInt(int fooInt) {
> this.fooInt = fooInt;
> }
> }
>
> tia
> rouble
>
> On Thu, Jan 26, 2012 at 1:21 PM, Daniel Kulp <[email protected]> wrote:
> > I believe this may have been due to an update of the version of JAXB
> > between
> > the two versions. CXF really doesn't do anything at this level.
> >
> > HOWEVER, can I see the annotations on the FOO object as well? Does it
> > have
> > an @XmlRootElement on it? How about an @XmlType annotation? Does the
> > @XmlType have a name attribute?
> >
> > Dan
> >
> > On Thursday, January 26, 2012 12:16:13 PM rouble wrote:
> > > CXF Gurus,
> > >
> > > I use JavaToWS to generate the WSDL on my development box. After
> >
> > migrating
> >
> > > to 2.4.3 (from 2.4.1) I noticed that the WSDL being generated is
> > > slightly different (uses references). And any clients generated
> > > using wsdl2java,>
> > on
> >
> > > that WSDL do not work. This issue is easily reproducible.
> > >
> > > The data object in question is, lets say, a Widget, and the SOAP API
> > > call is getWidget(). Here is what Widget looks like:
> > > <code>
> > > @XmlRootElement(name = "Widget")
> > > @XmlAccessorType(XmlAccessType.PROPERTY)
> > > @XmlType(name = "Widget")
> > > public class Widget {
> > >
> > > private FOO foo;
> > > private Bar bar;
> > >
> > > public FOO getFOO() {
> > >
> > > return foo;
> > >
> > > }
> > > public void setFOO(FOO foo) {
> > >
> > > this.foo = foo;
> > >
> > > }
> > > public Bar getBar() {
> > >
> > > return bar;
> > >
> > > }
> > > public void setBar(Bar bar) {
> > >
> > > this.bar = bar;
> > >
> > > }
> > >
> > > }
> > > </code>
> > >
> > > The WSDL generated by JavaToWS looks like this:
> > > <wsdl>
> > > <xs:complexType name="Widget">
> > >
> > > <xs:sequence>
> > >
> > > <xs:element minOccurs="0" name="bar"
> > > type="tns:Bar"/>
> > > <xs:element minOccurs="0" ref="tns:FOO"/>
> > >
> > > </xs:sequence>
> > >
> > > </xs:complexType>
> > > </wsdl>
> > >
> > > Notice how bar is explicitly listed inline, but FOO is referred to
> > > via a reference. In CXF 2.4.1, both of these elements would be
> > > explicitly>
> > listed
> >
> > > inline.
> > >
> > > And the generated code using wsdl2java looks like this:
> > > <code>
> > >
> > > @XmlAccessorType(XmlAccessType.FIELD)
> > > @XmlType(name = "Widget", propOrder = { "bar", "foo" })
> > > public class Widget {
> > >
> > > protected Bar bar;
> > > @XmlElement(name = "FOO", namespace =
> > > "http://example.com/")
> > > protected FOO foo;
> > >
> > > <SNIP>
> > >
> > > }
> > >
> > > </code>
> > >
> > > Notice, that FOO is explicitly marked to be in a namespace in the
> >
> > generated
> >
> > > code, and bar is in no explicit namespace.
> > >
> > > Now, when we call the getWidget() on the web service, we get back:
> > > <soap:Envelope
> > > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
> > >
> > > <soap:Body>
> > >
> > > <ns2:getWidgetResponse
> > > xmlns:ns2="http://example.com/">
> > >
> > > <return>
> > >
> > > <bar>
> > >
> > > <intBar>7</intBar>
> > >
> > > </bar>
> > > <FOO>
> > >
> > > <fooInt>99</fooInt>
> > >
> > > </FOO>
> > >
> > > </return>
> > >
> > > </ns2:getWidgetResponse>
> > >
> > > </soap:Body>
> > >
> > > </soap:Envelope>
> > >
> > > And CXF throws the exception:
> > > org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
> > > WARNING: Interceptor for {
> > > http://example.com/}FooWebService#{http://example.com/}getWidget has
> >
> > thrown
> >
> > > exception, unwinding now
> > > org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected
> > > element (uri:"", local:"FOO"). Expected elements are
> > > <{http://example.com/}FOO>,<{}bar>
> > >
> > >
> > > The CXF client is expecting FOO to be in the namespace
> >
> > http://example.com,
> >
> > > but JAXB does not namespace elements. Hence the exception. bar is
> > > unmarshalled just fine. Now this worked fine in when we used
> > > JavaToWS in 2.4.1 and is broke now. Any thoughts? Do I need to file
> > > a bug?
> > >
> > > tia,
> > > rouble
> >
> > --
> > Daniel Kulp
> > [email protected] - http://dankulp.com/blog
> > Talend Community Coder - http://coders.talend.com
--
Daniel Kulp
[email protected] - http://dankulp.com/blog
Talend Community Coder - http://coders.talend.com