Created CXF-4089: https://issues.apache.org/jira/browse/CXF-4089

cheers
rouble

On Thu, Jan 26, 2012 at 1:43 PM, Daniel Kulp <[email protected]> wrote:
> 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

Reply via email to