Weblogic - Simple Web Service (Hello World) with a JWS (Java Web Service) class
> (Weblogic|Fusion Middelware|FMW)
Table of Contents
1 - About
Steps on how to create a Java Web Service with the bottom-up Java Web Service file annotation method (ie from a java class and not from the WSDL file) on the weblogic application server. The web service is simple because it return only a string datatype.
2 - Articles Related
3 - Steps
3.1 - JWS File
The sample JWS file shows a Java class called HelloWorldImpl that contains a single public method, sayHelloWorld(String). The @WebService annotation specifies that the Java class implements a Web service called HelloWorldService. By default, all public methods are exposed as operations.
package examples.webservices.hello_world; // Import the @WebService annotation import javax.jws.WebService; @WebService(name="HelloWorldPortType", serviceName="HelloWorldService") /** * This JWS file forms the basis of simple Java-class implemented WebLogic * Web Service with a single operation: sayHelloWorld */ public class HelloWorldImpl { // By default, all public methods are exposed as Web Services operation public String sayHelloWorld(String message) { try { System.out.println("sayHelloWorld:" + message); } catch (Exception ex) { ex.printStackTrace(); } return "Here is the message: '" + message + "'"; } }
3.2 - Ant Build File
The following full ant build.xml file contains :
- properties (variable), such as ${ear-dir}
- Ant task such as taskdef <taskdef name=“jwsc”…> that specify the full Java classname of the task
- target such as <target name=“build-service”> that is a jwsc WebLogic Web service Ant task that:
- generates the supporting artifacts,
- compiles the user-created and generated Java code,
- and archives all the artifacts into an Enterprise Application EAR file that you later deploy to WebLogic Server.
Other present in the ant build file are:
- clean,
- undeploy,
- client,
- and run.
You specify the type of Web service (JAX-WS) that you want to create using type=“JAXWS”.
<project name="webservices-hello_world" default="all"> <!-- set global properties for this build --> <property name="wls.username" value="weblogic" /> <property name="wls.password" value="weblogic12" /> <property name="wls.hostname" value="localhost" /> <property name="wls.port" value="7001" /> <property name="wls.server.name" value="myManagedServer" /> <property name="wls.server.port" value="7003" /> <property name="ear.deployed.name" value="helloWorldEar" /> <property name="example-output" value="output" /> <property name="ear-dir" value="${example-output}/helloWorldEar" /> <property name="clientclass-dir" value="${example-output}/clientclasses" /> <path id="client.class.path"> <pathelement path="${clientclass-dir}"/> <pathelement path="${java.class.path}"/> </path> <taskdef name="jwsc" classname="weblogic.wsee.tools.anttasks.JwscTask" /> <taskdef name="clientgen" classname="weblogic.wsee.tools.anttasks.ClientGenTask" /> <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy"/> <target name="all" depends="clean,build-service,deploy,client" /> <target name="clean" depends="undeploy"> <delete dir="${example-output}"/> </target> <target name="build-service"> <jwsc srcdir="src" destdir="${ear-dir}"> <jws file="examples/webservices/hello_world/HelloWorldImpl.java" type="JAXWS"/> </jwsc> </target> <target name="deploy"> <wldeploy action="deploy" name="${ear.deployed.name}" source="${ear-dir}" user="${wls.username}" password="${wls.password}" verbose="true" adminurl="t3://${wls.hostname}:${wls.port}" targets="${wls.server.name}" /> </target> <target name="undeploy"> <wldeploy action="undeploy" name="${ear.deployed.name}" failonerror="false" user="${wls.username}" password="${wls.password}" verbose="true" adminurl="t3://${wls.hostname}:${wls.port}" targets="${wls.server.name}" /> </target> <target name="client"> <clientgen wsdl="http://${wls.hostname}:${wls.server.port}/HelloWorldImpl/HelloWorldService?WSDL" destDir="${clientclass-dir}" packageName="examples.webservices.hello_world.client" type="JAXWS"/> <javac srcdir="${clientclass-dir}" destdir="${clientclass-dir}" includes="**/*.java"/> <javac srcdir="src" destdir="${clientclass-dir}" includes="examples/webservices/hello_world/client/**/*.java"/> </target> <target name="run"> <java classname="examples.webservices.hello_world.client.Main" fork="true" failonerror="true"> <classpath refid="client.class.path"/> <arg line="http://${wls.hostname}:${wls.port}/HelloWorldImpl/HelloWorldService" /> </java> </target> </project>
3.3 - Ant
3.3.1 - ClassPath
3.3.1.1 - setDomainEnv
Open a command window and execute the setDomainEnv.cmd (Windows) or setDomainEnv.sh (UNIX) script, located in the bin subdirectory of your domain directory. The default location of WebLogic Server domains is MW_HOME/user_projects/domains/domainName
set DOMAIN_NAME=gerardnico_domain set USERDOMAIN_HOME=C:\Oracle\Middleware\user_projects\domains\gerardnico_domain cd %USERDOMAIN_HOME% call %USERDOMAIN_HOME%\bin\setDomainEnv.cmd
3.3.1.2 - Eclipse OEPE
Add the weblogic.jar in the Antclass path by using the external configuration tools (Run > External Tools > External Tool Configuration)
3.3.2 - Execution
3.3.2.1 - One Target
Execute the jwsc Ant task:
- at the command line by specifying the build-service target:
C:\workspace\hello_world>ant build-service
- with Eclipse OEPE. In the outline view, select the build-service target and Run > External Tool > Run as > Ant Build
Buildfile: C:\workspace\hello_world\build.xml build-service: [jwsc] warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds [jwsc] JWS: processing module /examples/webservices/hello_world/HelloWorldImpl [jwsc] Parsing source files [jwsc] Parsing source files [jwsc] 1 JWS files being processed for module /examples/webservices/hello_world/HelloWorldImpl [jwsc] JWS: C:\workspace\hello_world\src\examples\webservices\hello_world\HelloWorldImpl.java Validated. [jwsc] Processing 1 JAX-WS web services... [jwsc] warning: Annotation types without processors: [javax.xml.bind.annotation.XmlRootElement, javax.xml.bind.annotation.XmlAccessorType, javax.xml.bind.annotation.XmlType, javax.xml.bind.annotation.XmlElement] [jwsc] 1 warning [jwsc] Compiling 3 source files to C:\Users\RIXNI\AppData\Local\Temp\_gwf3vm [jwsc] Deleting existing module outputFile C:\workspace\hello_world\output\helloWorldEar\examples\webservices\hello_world\HelloWorldImpl.war [jwsc] Building jar: C:\workspace\hello_world\output\helloWorldEar\examples\webservices\hello_world\HelloWorldImpl.war [jwsc] Created JWS deployment outputFile: C:\workspace\hello_world\output\helloWorldEar\examples\webservices\hello_world\HelloWorldImpl.war [jwsc] [EarFile] Application File : C:\workspace\hello_world\output\helloWorldEar\META-INF\application.xml [AntUtil.deleteDir] Deleting directory C:\Users\RIXNI\AppData\Local\Temp\_gwf3vm BUILD SUCCESSFUL Total time: 4 seconds
See the output/helloWorldEar directory to view the files and artifacts generated by the jwsc Ant task.
3.3.2.2 - All
Execute the jwsc Ant task:
- at the command line by specifying the build-service target:
C:\workspace\hello_world>ant all
- with Eclipse OEPE: Run > External Tool > Run as > Ant Build. The default target (ie all) will run.
3.4 - Testing
3.4.1 - WSDL
http://localhost:7003/HelloWorldImpl/HelloWorldService?WSDL
<!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Oracle JAX-WS 2.1.5. --> <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Oracle JAX-WS 2.1.5. --> <definitions targetNamespace="http://hello_world.webservices.examples/" name="HelloWorldService"> <types> <xsd:schema> <xsd:import namespace="http://hello_world.webservices.examples/" schemaLocation="http://localhost:7003/HelloWorldImpl/HelloWorldService?xsd=1"/> </xsd:schema> </types> <message name="sayHelloWorld"> <part name="parameters" element="tns:sayHelloWorld"/> </message> <message name="sayHelloWorldResponse"> <part name="parameters" element="tns:sayHelloWorldResponse"/> </message> <portType name="HelloWorldPortType"> <operation name="sayHelloWorld"> <input message="tns:sayHelloWorld"/> <output message="tns:sayHelloWorldResponse"/> </operation> </portType> <binding name="HelloWorldPortTypePortBinding" type="tns:HelloWorldPortType"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="sayHelloWorld"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="HelloWorldService"> <port name="HelloWorldPortTypePort" binding="tns:HelloWorldPortTypePortBinding"> <soap:address location="http://localhost:7003/HelloWorldImpl/HelloWorldService"/> </port> </service> </definitions>
3.4.2 - Client
4 - Support
4.1 - taskdef class cannot be found
BUILD FAILED C:\workspace\hello_world\build.xml:5: taskdef class weblogic.wsee.tools.anttasks.JwscTask cannot be found using the classloader AntClassLoader[]
The jar Middleware_home/wlserver_10.3/server/lib/weblogic.jar“ is not in the AntBuildPath.
Two solutions:
- run the setDomainEnv
- in Eclipse OEPE, add the weblogic.jar in the AntPath by using the external configuration tools (Run > External Tools > External Tool Configuration)
4.2 - Target "all" does not exist in the project
BUILD FAILED Target "all" does not exist in the project "webservices-hello_world".
When using the example of the documentation, the default action is all but the all target doesn't exit then:
- Replace
<project name="webservices-hello_world" default="all">
with
<project name="webservices-hello_world" default="build-service">
- or add a all target
<target name="all" depends="clean,build-service,deploy,client" />
4.3 - Unable to contact 'myManagedServer'
[wldeploy] java.rmi.RemoteException: [Deployer:149145]Unable to contact 'myManagedServer'. Deployment is deferred until 'myManagedServer' becomes available.