You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by rouble <r....@gmail.com> on 2013/02/26 04:44:43 UTC

Re: JavaToWS generating non-working WSDL (in CXF 2.4.3+)

CXFers,

This is still broke in 2.7.3. That is, in the last three major
releases of CXF it is still impossible to name the fields of a data
object in all capital letters. This is because the WSDL generated is
unusable.

The last time I filed a JIRA with a test case it was moved to the JAXB
team who just closed it. Can someone help me get to a resolution on
this. I can help with creating test cases etc. It is affecting our
migration plans.

Cheers
Rouble

On Tue, Feb 7, 2012 at 6:00 PM, rouble <r....@gmail.com> wrote:
> Created CXF-4089: https://issues.apache.org/jira/browse/CXF-4089
>
> cheers
> rouble
>
> On Thu, Jan 26, 2012 at 1:43 PM, Daniel Kulp <dk...@apache.org> 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 <dk...@apache.org> 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
>>> > dkulp@apache.org - http://dankulp.com/blog
>>> > Talend Community Coder - http://coders.talend.com
>> --
>> Daniel Kulp
>> dkulp@apache.org - http://dankulp.com/blog
>> Talend Community Coder - http://coders.talend.com