Fabian explained how WSIT features can be configured on Java SE 6 Endpoint API exposed as part of JAX-WS 2.1. In this blog, I start with a Reliable Messaging-enabled endpoint developed using NetBeans IDE 5.5.1 and WSIT plug-in and then provide detailed steps, along with code, to deploy it in Java SE 6.
- Create a Reliable Web service endpoint using WSIT plug-in and NetBeans 5.5.1 by watching this screencast.
- Download and install WSIT Milestone 5. Copy webservices-api.jar in Java SE 6 ‘
jre\lib\endorsed‘ directory. - All the capabilities enabled at an endpoint, such as Reliable Messaging for this one, are stored in the WSIT configuration file. In NetBeans IDE, expand your Project, ‘
Web Pages‘, ‘WEB-INF‘. The configuration file be named something similar to ‘wsit-server.HelloWebService.xml‘ following the format ‘wsit-<packageName>.<ServiceName>.xml‘. Here is how the config file looks like:
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="HelloWebServiceService" targetNamespace="http://server/" xmlns:tns="http://server/" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsaws="http://www.w3.org/2005/08/addressing" xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm/policy"> <message name="sayHello"/> <message name="sayHelloResponse"/> <portType name="HelloWebService"> <wsdl:operation name="sayHello"> <wsdl:input message="tns:sayHello"/> <wsdl:output message="tns:sayHelloResponse"/> </wsdl:operation> </portType> <binding name="HelloWebServicePortBinding" type="tns:HelloWebService"> <wsp:PolicyReference URI="#HelloWebServicePortBindingPolicy"/> <wsdl:operation name="sayHello"> <wsdl:input/> <wsdl:output/> </wsdl:operation> </binding> <service name="HelloWebServiceService"> <wsdl:port name="HelloWebServicePort" binding="tns:HelloWebServicePortBinding"/> </service> <wsp:Policy wsu:Id="HelloWebServicePortBindingPolicy"> <wsp:ExactlyOne> <wsp:All> <wsaws:UsingAddressing xmlns:wsaws="http://www.w3.org/2006/05/addressing/wsdl"/> <wsrm:RMAssertion/> </wsp:All> </wsp:ExactlyOne> </wsp:Policy></definitions>
Copy this config file by the name
wsit-server.HelloWebService.xmlin META-INF directory in your classpath. - The Web service implementation class looks like:
package server; import javax.jws.*; @WebService(targetNamespace="http://server/")public class HelloWebService { @WebMethod public String hello(@WebParam(name="name")String text) { return "Hello " + text; } } As you see, this is a plain JAX-WS Web service endpoint class.
- The JAX-WS Endpoint code that starts the Web service endpoint looks like:
package server; import java.io.IOException; import javax.xml.ws.Endpoint; public class Main { private static final int PORT = 58888; private static final String HOST = "localhost"; public static void main(String[] args) { Endpoint endpoint = Endpoint.create(new HelloWebService()); String address = "http://" + HOST + ":" + PORT + "/"; endpoint.publish(address); System.out.println("Endpoint hosted at ... " + address); } } - The sequence of commands to deploy the endpoint is:
"\Program Files\Java\jdk1.6.0_01\bin
\javac.exe" -d . server\*.java"\Program Files\Java\jdk1.6.0_01\bin \wsgen.exe" -cp . server.HelloWebServicejava -classpath .;\jax-ws-latest -wsit\lib\webservices-rt.jar server.Main - And then you see the following output on the command prompt:
java -classpath .;C:\testbed\jax-ws-latest
-wsit\lib\webservices-rt.jar server.MainJun 18, 2007 4:46:34 PM [com.sun.xml.ws.policy.jaxws .PolicyConfigParser] parseINFO: WSP1049: Loaded WSIT configuration from file: file:/C:/workarea/wsit/javase6 /META-INF/wsit-server.HelloWebService.xmlJun 18, 2007 4:46:34 PM [com.sun.xml.ws.tx.common .TxMapUpdateProvider] updateINFO: WSTX-COMMON-2005: running in a non Java EE container; disable mapping of Container Managed Transaction EJB to WS-AT Policy assertions due to 'javax/ejb/TransactionManageme nt'Endpoint hosted at ... http://localhost:58888/
That's it, the endpoint now deployed at 'http://localhost:58888/MyService?wsdl' is Reliable Messaging enabled. This endpoint can be invoked using any of the methods shown here.
Technorati: webservices wsit jax-ws glassfish javase6
Related posts:
Good stuff! Some smileys in the listings, though – I think you need to turn off a plugin…
Comment by Pat Patterson — June 18, 2007 @ 11:51 pm
Thanks Pat for the comment! I thought those smileys were cute
But to be meaningful and listening to my readers, turned off the plugin.
Comment by Arun — June 19, 2007 @ 6:03 am
Awesome stuff.. very helpful. Can you give me the code how to write for login page using web service in java. It would be helpful. thank you
Comment by saikrishna — November 2, 2007 @ 7:35 am
saikrishna, The code will be no different that invoking any other Web service. You just need to make sure your client-side artifacts are bundled in the WAR file though.
Comment by Arun Gupta — November 4, 2007 @ 3:39 pm
Great example!
I need to be able "runtime" to choose wsit config file. One way would be to have multiple "WEB-INF/..xml" and add exactly one of them to the jvm classpath.
A dream scenario would be if I could do this programmatically at startup, like WSITEnginde.setConfig("mywsit.xml"). It might be possible when looking at the PolicyConfigParser.java ..
Comment by Rickard Lundin — February 13, 2008 @ 6:06 am
Rickard, it would be easier to discuss your scenario on the mailing list users@metro.dev.java.net: https://metro.dev.java.net/servlets/ProjectMailingListList
You are having at least two options, both of which are a bit lengthy to explain. I am working on a blog entry right now and will have that ready and published by Monday at the latest. I will keep you posted.
Tjenare, Fabian
Comment by Fabian Ritzmann — February 14, 2008 @ 6:22 am
Rickard, I am discussing the options you are having here: http://blogs.sun.com/ritzmann/entry/non_standard_wsit_configuration_file
Comment by Fabian Ritzmann — February 18, 2008 @ 8:30 am
<html>
<body>
Hi, I have a problem of accessing web service methods, I have user name and password and I am using netbeans 6 but I don’t know how to use them. I developing web service client. Server have been developed by other programmer they just given me wsdl file only.
I always I get this kind of exception
javax.xml.ws.soap.SOAPFaultException: WSDoAllReceiver: Request does not contain required Security header
at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:187)
at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:116)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:254)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:224)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:117)
</body>
</html>
Comment by Ali — April 18, 2008 @ 12:46 pm
Hi, I have a problem of accessing web service methods, I have user name and password and I am using netbeans 6 but I don’t know how to use them. I developing web service client. Server have been developed by other programmer they just given me wsdl file only.
Comment by BATTERY — November 27, 2008 @ 4:54 pm