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
