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

Reply via email to