[jboss-user] [JBossWS] - Raw Style webservices [Design question]
viniciuscarvalho
do-not-reply at jboss.com
Wed Oct 3 16:28:08 EDT 2007
Hello there! I'm developing a Topdown webservice, and defining my own WSDL, and using @WebserviceProvider annotations.
The service is running, I can access it using webservice explorer or SOAPUI. When I generate the client using JBoss WS, I'm getting some errors on the response. I know it's something related to my WSDL, and SOAP response. So I was hopping someone could assist me:
WSDL
| <?xml version="1.0" encoding="UTF-8" standalone="no"?>
| <wsdl:definitions
| xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
| xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
| xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
| xmlns:sys="http://www.acme.com/schemas/sys"
| targetNamespace="http://www.acme.com/sys/definitions"
| xmlns:tns="http://www.acme.com/sys/definitions">
| <wsdl:types>
| <xsd:schema>
| <xsd:import namespace="http://www.acme.com/schemas/sys" schemaLocation="Command.xsd" id="sys"/>
| </xsd:schema>
|
| </wsdl:types>
|
| <wsdl:message name="CommandRequest">
| <wsdl:part name="parameters" element="sys:anyCommand"></wsdl:part>
| </wsdl:message>
| <wsdl:message name="CommandResponse">
| <wsdl:part name="return" element="sys:CommandResponse"></wsdl:part>
| </wsdl:message>
|
| <wsdl:portType name="CommandProcessorPortType">
| <wsdl:operation name="process">
| <wsdl:input message="tns:CommandRequest" name="CommandRequestInput"></wsdl:input>
| <wsdl:output message="tns:CommandResponse" name="CommandResponseOutput"></wsdl:output>
| </wsdl:operation>
| </wsdl:portType>
|
| <wsdl:binding name="CommandProcessorBinding" type="tns:CommandProcessorPortType">
| <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
| <wsdl:operation name="process">
| <soap:operation soapAction="http://www.acme.com/sys/CommandRequest"/>
| <wsdl:input>
| <soap:body use="literal"/>
| </wsdl:input>
| <wsdl:output>
| <soap:body use="literal"/>
| </wsdl:output>
| </wsdl:operation>
| </wsdl:binding>
|
| <wsdl:service name="CommandProcessorService">
| <wsdl:port name="CommandProcessorPort" binding="tns:CommandProcessorBinding">
| <soap:address location="http://localhost:8080/CommandProcessorService"/>
| </wsdl:port>
| </wsdl:service>
| </wsdl:definitions>
|
|
Command.xsd
| <?xml version="1.0" encoding="UTF-8"?>
| <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
| targetNamespace="http://www.acme.com/schemas/sys"
| xmlns:sys="http://www.acme.com/schemas/sys"
| elementFormDefault="qualified">
|
| <xsd:element name="anyCommand">
| <xsd:complexType>
| <xsd:sequence>
| <xsd:any minOccurs="1"></xsd:any>
| </xsd:sequence>
| </xsd:complexType>
| </xsd:element>
|
| <xsd:element name="CommandResponse">
| <xsd:complexType>
| <xsd:sequence>
| <xsd:element name="return" type="sys:ResponseCommandType"></xsd:element>
| </xsd:sequence>
| </xsd:complexType>
| </xsd:element>
|
|
|
| <xsd:complexType name="ResponseCommandType">
| <xsd:sequence>
| <xsd:element name="id" type="xsd:long"></xsd:element>
| <xsd:element name="message" type="xsd:string"></xsd:element>
| </xsd:sequence>
| </xsd:complexType>
| </xsd:schema>
|
My Provider
|
| @Local
| @Stateless
| @WebServiceProvider(wsdlLocation="META-INF/wsdl/CommandProcessor.wsdl",
| targetNamespace="http://www.acme.com/sys/definitions",
| serviceName="CommandProcessorService",
| portName="CommandProcessorPort")
| @ServiceMode(value=Service.Mode.PAYLOAD)
| public class CommandProcessor implements Provider<Source> {
| Source returnMessage;
| public Source invoke(Source messge) {
|
| DOMSource domSource = null;
|
| try {
| Transformer transformer = TransformerFactory.newInstance().newTransformer();
| transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
| transformer.setOutputProperty(OutputKeys.METHOD, "xml");
| OutputStream out = new ByteArrayOutputStream();
| StreamResult streamResult = new StreamResult();
| streamResult.setOutputStream(out);
| transformer.transform(messge, streamResult);
| String xmlReq = streamResult.getOutputStream().toString();
| System.out.println(xmlReq);
| domSource = new DOMSource(createResponseContent());
| transformer.transform(domSource, streamResult);
| xmlReq = streamResult.getOutputStream().toString();
| System.out.println(xmlReq);
| } catch (Exception e) {
| // TODO Auto-generated catch block
| e.printStackTrace();
| }
| return domSource;
| }
|
| private Document createResponseContent() throws Exception{
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
| dbf.setNamespaceAware(true);
| DocumentBuilder db = dbf.newDocumentBuilder();
| Document doc = db.newDocument();
| Element responseCommand = doc.createElementNS("http://www.acme.com/sys/definitions", "sys:CommandResponse");
| Element ret = doc.createElement("return");
| Element id = doc.createElement("id");
| id.appendChild(doc.createTextNode("1"));
| Element message = doc.createElement("message");
| message.appendChild(doc.createTextNode("comando recebido"));
| ret.appendChild(id);
| ret.appendChild(message);
| responseCommand.appendChild(ret);
| doc.appendChild(responseCommand);
| return doc;
| }
|
| }
|
Well, first, when I run ws-provide it throws a lot of warnings on the console, but it seems that all artifacts are created (Port,Service,Bindings,ObjectFactory).
Ok, running using soap ui:
| Request:
|
| <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.acme.com/schemas/sys">
| <soapenv:Header/>
| <soapenv:Body>
| <csm:anyCommand>
| <asteriskCommand>
| <voip>true</voip>
| </asteriskCommand>
| </csm:anyCommand>
| </soapenv:Body>
| </soapenv:Envelope>
|
| Response:
|
| <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
| <env:Header/>
| <env:Body>
| <sys:CommandResponse xmlns:sys="null">
| <return>
| <id>1</id>
| <message>comando recebido</message>
| </return>
| </csm:CommandResponse>
| </env:Body>
| </env:Envelope>
|
Now, the odd thing, is that the xmlns:sys is null, when I print it on the serverside it displays that the xmlns:sys is pointing to the namespace.
So I run this test with the generated client proxy, and I get an error:
Caused by: org.jboss.ws.WSException: Cannot find child element: {http://www.acme.com/schemas/sys}CommandResponse
I really don't know if this is caused because the xmlns is being returned null, and if so, why? Or did I messed the whole doc/literal wrapped/bare style? I was thinking that I was using bare style :)
Any help would be great :)
Regards
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4091226#4091226
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4091226
More information about the jboss-user
mailing list