[JBossWS] - Providing your own wsdl instead of the generated one.
by ngtdave
Alright, it took me a long time to put all the pieces together after searching the forums and jira. If you want to serve up your own wsdl instead of the generated one you do the following:
In the interface you specify the wsdlLocation:
@WebService(name = "Echo", targetNamespace = "http://echo/", wsdlLocation="META-INF/wsdl/EchoService.wsdl")
|
Then when you package your war file, you put the wsdl in the META-INF/wsdl directory of your war.
I apologize if this is obvious, but it took me a while to figure out.
Here is the full working example using top-down design:
First I started with EchoService.wsdl
<?xml version="1.0" encoding="UTF-8"?>
| <definitions name='EchoService' targetNamespace='http://echo/' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://echo/' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
| <types>
| <xs:schema targetNamespace='http://echo/' version='1.0' xmlns:tns='http://echo/' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
| <xs:element name='echo' type='tns:echo'/>
| <xs:element name='echoResponse' type='tns:echoResponse'/>
| <xs:complexType name='echo'>
| <xs:sequence>
| <xs:element minOccurs='0' name='arg0' type='xs:string'/>
| </xs:sequence>
| </xs:complexType>
| <xs:complexType name='echoResponse'>
| <xs:sequence>
| <xs:element minOccurs='0' name='return' type='xs:string'/>
| </xs:sequence>
| </xs:complexType>
| </xs:schema>
| </types>
| <message name='Echo_echo'>
| <part element='tns:echo' name='echo'/>
| </message>
| <message name='Echo_echoResponse'>
| <part element='tns:echoResponse' name='echoResponse'/>
| </message>
| <portType name='Echo'>
| <operation name='echo' parameterOrder='echo'>
| <input message='tns:Echo_echo'/>
| <output message='tns:Echo_echoResponse'/>
| </operation>
| </portType>
| <binding name='EchoBinding' type='tns:Echo'>
| <soap:binding style='document' transport='http://schemas.xmlsoap.org/soap/http'/>
| <operation name='echo'>
| <soap:operation soapAction=''/>
| <input>
| <soap:body use='literal'/>
| </input>
| <output>
| <soap:body use='literal'/>
| </output>
| </operation>
| </binding>
| <service name='EchoService'>
| <documentation>Congrats! You have published your own WSDL!</documentation>
| <port binding='tns:EchoBinding' name='EchoPort'>
| <soap:address location='REPLACE_WITH_ACTUAL_URL'/>
| </port>
| </service>
| </definitions>
Then I generated the java files using wsconsume:
$ wsconsume -k EchoService.wsdl
| echo/Echo.java
| echo/EchoResponse.java
| echo/EchoService.java
| echo/Echo_Type.java
| echo/ObjectFactory.java
| echo/package-info.java
| echo/Echo.java
| echo/EchoResponse.java
| echo/EchoService.java
| echo/Echo_Type.java
| echo/ObjectFactory.java
| echo/package-info.java
I promptly threw away EchoService.java because it's really for the client, not the server.
Next I implemented EchoImpl.java
package echo;
|
| @javax.jws.WebService(endpointInterface="echo.Echo")
| public class EchoImpl implements Echo
| {
| public String echo(String arg0)
| {
| return arg0;
| }
| }
Then I edited Echo.java and added wsdlLocation (bolded below)
package echo;
|
| import javax.jws.WebMethod;
| import javax.jws.WebParam;
| import javax.jws.WebResult;
| import javax.jws.WebService;
| import javax.xml.ws.RequestWrapper;
| import javax.xml.ws.ResponseWrapper;
|
|
| /**
| * JBossWS Generated Source
| * ....
| * JAX-WS Version: 2.0
| *
| */
| @WebService(name = "Echo", targetNamespace = "http://echo/", wsdlLocation="META-INF/wsdl/EchoService.wsdl")
| public interface Echo {
|
|
| /**
| *
| * @param arg0
| * @return
| * returns java.lang.String
| */
| @WebMethod
| @WebResult(targetNamespace = "")
| @RequestWrapper(localName = "echo", targetNamespace = "http://echo/", className = "echo.Echo_Type")
| @ResponseWrapper(localName = "echoResponse", targetNamespace = "http://echo/", className = "echo.EchoResponse")
| public String echo(
| @WebParam(name = "arg0", targetNamespace = "")
| String arg0);
|
| }
|
Next I created a web.xml:
<?xml version="1.0" encoding="UTF-8"?>
|
| <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
| xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
| version="2.4">
|
| <servlet>
| <servlet-name>echo</servlet-name>
| <servlet-class>echo.Echo</servlet-class>
| </servlet>
|
| <servlet-mapping>
| <servlet-name>echo</servlet-name>
| <url-pattern>/*</url-pattern>
| </servlet-mapping>
|
| </web-app>
|
Then I packed them up into a echo.war:
META-INF/
| META-INF/MANIFEST.MF
| META-INF/wsdl/
| META-INF/wsdl/EchoService.wsdl
| WEB-INF/
| WEB-INF/classes/
| WEB-INF/classes/echo/
| WEB-INF/classes/echo/Echo.class
| WEB-INF/classes/echo/EchoImpl.class
| WEB-INF/classes/echo/EchoResponse.class
| WEB-INF/classes/echo/Echo_Type.class
| WEB-INF/classes/echo/ObjectFactory.class
| WEB-INF/classes/echo/package-info.class
| WEB-INF/web.xml
Then I dropped it into the deploy directory.
When I looked at the log file, I saw it deployed my wsdl:
07:39:03,777 INFO [TomcatDeployer] deploy, ctxPath=/echo, warUrl=.../tmp/deploy/tmp45417echo-exp.war/
| 07:39:04,839 INFO [WSDLFilePublisher] WSDL published to: file:/D:/jboss/jboss-4.2.0.CR1/server/default/data/wsdl/echo.war/EchoService.wsdl
| 07:39:04,886 INFO [ServiceEndpointManager] WebService started: http://127.0.0.1:8080/echo
Instead of what it did when I didn't properly specify the wsdlLocation:
07:10:04,777 INFO [TomcatDeployer] undeploy, ctxPath=/echo, warUrl=.../tmp/deploy/tmp45397echo-exp.war/
| 07:10:06,449 INFO [TomcatDeployer] deploy, ctxPath=/echo, warUrl=.../tmp/deploy/tmp45400echo-exp.war/
| 07:10:06,730 INFO [WSDLFilePublisher] WSDL published to: file:/D:/jboss/jboss-4.2.0.CR1/server/default/data/wsdl/echo.war/EchoService45401.wsdl
Sure enough, going to http://127.0.0.1:8080/echo?wsdl displayed my wsdl, not the generated one.
Hope this helps some of you out there.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4031052#4031052
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4031052
17 years, 9 months
[JBossWS] - Re: beginner needs help
by nean
"vitor_b" wrote : Hello
|
| Thank you for your reply.
|
| I haven't tried your solution, since i created ant task, which generates mapping and wsdl files for me. With these files my web service (even with more complex input and output) works fine.
| And i didn't have to add these tags. Maybe that was becouse of my version of jbossws (1.4) but I'm really not sure. I only had to create wscompile-config.xml file.
|
| The problem described in my first post was occured becouse i created these files by my hand. I did it becouse i need to understand every aspect of creating these files.
|
| And the last thing: i've seen webservice with extremally complex input and output, but someone else created it.
|
| Best regards
|
| vitor_b
|
|
Could you explain exactly how you did it? all steps to obtain this please...
Thanks
nean
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4031017#4031017
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4031017
17 years, 9 months