Hello All CXF Users,
I am using a standard setup
cxf-2.5
jdk1.7.0_01
My SEI exposes REST (XML and JSON outputs) and SOAP.
For SOAP:
I am trying to use UNQUALIFIED for elementFormDefault and attributeFormDefault.
For REST I just drop the namespace.
So package-info.java looks like:
@javax.xml.bind.annotation.XmlSchema( namespace=MyApp.NS,
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED,
attributeFormDefault =
javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED,
xmlns={@javax.xml.bind.annotation.XmlNs(prefix =
MyApp.NS_QUALIFIER , namespaceURI=MyApp.NS)}
)
import com.mycompany.MyApp;
package com.mycompany;
This generates UNQUALIFIED SOAP xml of the form:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<MyApp:methodResponse xmlns:MyApp="http://mycompany.myapp.com/">
<methodResponseDataList>
<methodResponseData>
<appName>Email</appName>
<appRole>UPMC Email User</appRole>
</methodResponseData>
</methodResponseDataList>
</MyApp:methodResponse>
</soap:Body>
</soap:Envelope>
To further test the use of my application
I called
wsdl2java.bat 'http://myappurl:/soap?wsdl'
As soon as this is working I will then call wadl2java ... :)
This generated a very cool client that really makes it easy to use the
application.
Using a different IDE than I use to write my server I tried to test the client.
When I call "method" using this client I get the following output:
creating Client
Dec 12, 2011 9:00:12 AM
org.apache.cxf.service.factory.ReflectionServiceFactoryBean
buildServiceFromWSDL
INFO: Creating Service
{http://www.springframework.org/schema/beans}MyApp from WSDL:
http://localhost:8080/MyApp/soap?wsdl
Dec 12, 2011 9:00:16 AM org.apache.cxf.phase.PhaseInterceptorChain
doDefaultLogging
WARNING: Interceptor for
{http://www.springframework.org/schema/beans}MyApp#{http://mynamespace/}method
has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected
element (uri:"", local:"methodResponseData"). Expected elements are
<{http://mynamespace/}methodResponseData>
at
org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:824)
at
org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:644)
at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:156)
After tweaking this problem I added on the CLIENT to the
package-info.java generated by wsdl2java for the client the following
2 lines:
@javax.xml.bind.annotation.XmlSchema( namespace = "http://mynamepace",
elementFormDefault =
javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED, //Added this line
attributeFormDefault =
javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED //Added this line
)
This had no effect.
Who reads elementFormDefault? CXF or JAXB?
I could change elementFormDefault and attributeFormDefault in the
server back to QUALIFIED but that makes the xml much less readable and
also avoids a problem that my warrant solving.
I still find that the xml should output a xmlns="http://mynamespace"
If this attribute is not present in a XML what does XML consider an
unqualified xml tag's namespace to be?
To get this output I tried adding namespace=MyApp.NS to my @XmlType or
@XmlRootElement but still does not change the result.
I also considered that the fact that my response is
List<methodResponseData> instead of a wrapper class
such as
class ListOfResponseData {
public List<methodResponseData> getItem();
}
could be the source of the issue, but again when calling a method that
returns only a single methodResponseData and not a List, I also get
the same unmarshalling error. So @XMLElement Wrapper on the SEI is not
related to the issue.
My SEI has annotations of the form:
@GET
@Path(" thepath ")
@WebResult(name = "methodResponseData"")
@XmlElementWrapper(name = "ListOfMethodResponseData")
public MethodResponseData" method() throws MyAppException;
In about two weeks I can return to this problem and debug further but
some pointers would be great on this issue and it might have a quick
fix.
Questions:
Can I use wsdl2java and still use the UNQUALIFIED annotation in
package-info.java?
Should the xml contain an attribute specifying the unqualified
namespace xmlns="http://mynamespace" somewhere. If so how can I get
that into the output?
The ability to expose to users a client jar that can be used without
prior knowledge of XML/Transports/Protocols straightforward java code
is a great plus even at the cost of creating a dependency on the
CXF-2.5 runtime for their project. The more sophisticated WebService
users will call his wsdl2java or svcutil (.net users) or other wsdl
consumer and some may simply parse the xml/json using standard parsers
while still others will write code to read the xml directly. This of
course depending on their needs and level of sophistication with
WebServices.
Thanks!
Miguel