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#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...