{"id":59543,"date":"2018-09-03T11:00:37","date_gmt":"2018-09-03T08:00:37","guid":{"rendered":"http:\/\/examples.javacodegeeks.com\/?p=59543"},"modified":"2018-09-03T10:44:19","modified_gmt":"2018-09-03T07:44:19","slug":"jax-ws-tutorial-beginners","status":"publish","type":"post","link":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/","title":{"rendered":"JAX-WS Tutorial for Beginners"},"content":{"rendered":"<p>Java API for XML Web Services (JAX-WS) is a Java programming language for creating web services, particularly SOAP services. In this tutorial, we will build a multi-module Maven project to demonstrate how to create, deploy, consume, and test JAX-WS web services.<\/p>\n<div class=\"toc\">\n<h3>Table Of Contents<\/h3>\n<dl>\n<dt><a href=\"#heading1\">1. Introduction<\/a><\/dt>\n<dt><a href=\"#heading2\">2. A Brief History of Web Services<\/a><\/dt>\n<dt><a href=\"#heading3\">3. Technologies Used<\/a><\/dt>\n<dt><a href=\"#heading4\">4. Maven Project<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#heading41\">4.1. Parent Project<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#heading5\">5. Generated Stubs from Employee WSDL<\/a><\/dt>\n<dt><a href=\"#heading6\">6. Bottom-Up<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#heading61\">6.1 Pom.xml<\/a><\/dt>\n<dt><a href=\"#heading62\">6.2 HelloWorldService<\/a><\/dt>\n<dt><a href=\"#heading63\">6.3 Publish Web Services<\/a><\/dt>\n<dt><a href=\"#heading64\">6.4\u00a0<\/a><a href=\"#heading65\">Demo with SoapUI<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#heading7\">7. Top-Down<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#heading71\">7.1 Pom.xml<\/a><\/dt>\n<dt><a href=\"#heading72\">7.2 EmployeeLookupService<\/a><\/dt>\n<dt><a href=\"#heading73\">7.3 Publish Web Service<\/a><\/dt>\n<dt><a href=\"#heading74\">7.4 <\/a><a href=\"#heading75\">Demo with SoapUI<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#heading8\">8. Tomcat Server<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#heading81\">8.1 Pom.xml<\/a><\/dt>\n<dt><a href=\"#heading82\">8.2 EmployeeService<\/a><\/dt>\n<dt><a href=\"#heading83\">8.3 Web Configuration<\/a><\/dt>\n<dt><a href=\"#heading84\">8.4 Start the Web Services<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#heading9\">9. SOAP Client<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#heading91\">9.1 Generate Stubs<\/a><\/dt>\n<dt><a href=\"#heading92\">9.2 Create Client Services<\/a><\/dt>\n<dt><a href=\"#heading93\">9.3 JUnit Tests<\/a><\/dt>\n<dt><a href=\"#heading94\">9.4 Acceptance Tests<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#heading10\">10. JAX-WS Tutorial &#8211; Summary<\/a><\/dt>\n<dt><a href=\"#heading11\">11. Download the Source Code<\/a><\/dt>\n<\/dl>\n<\/div>\n<h2><a name=\"heading1\"><\/a>1. Introduction<\/h2>\n<p><a href=\"https:\/\/javaee.github.io\/tutorial\/jaxws001.html\" target=\"_blank\" rel=\"noopener\">Java API for XML Web Services<\/a>\u00a0(JAX-WS) is a Java programming language for creating web services, particularly SOAP services.\u00a0JAX-WS 2.0 specification was introduced in 2005 and has been part of JDK since JDK6.\u00a0JAX-WS uses\u00a0annotations\u00a0to simplify the development of web services.<\/p>\n<p>JAX-WS provides the\u00a0<code>javax.jws.WebService<\/code> annotation to define a class as a web service. A service endpoint interface (SEI) is an interface which defines the web methods that clients can invoke.\u00a0An SEI is not required when building a JAX-WS endpoint. There are a few rules when developing JAX-WS web services:<\/p>\n<ul>\n<li>The implementation class of SEI must be annotated with either\u00a0<code>javax.jws.WebService<\/code> or\u00a0<code>javax.jws.WebServiceProvider<\/code><\/li>\n<li>The implementation class of SEI must have a default public constructor<\/li>\n<li>The methods of the\u00a0implementation class of SEI must be public and must not be declared with <code>static<\/code>, <code>abstract<\/code>, or <code>final<\/code><\/li>\n<li>The methods must be annotated with <code>javax.jws.WebMethod<\/code> if clients need to invoke it<\/li>\n<\/ul>\n<p>In this example, I will demonstrate how to:<\/p>\n<ul>\n<li>Create a web service using a Bottom-up approach<\/li>\n<li>Create a web service using a Top-down\u00a0approach<\/li>\n<li>Deploy a web service<\/li>\n<li>Consume a web service<\/li>\n<\/ul>\n<h2><a name=\"heading2\"><\/a>2. A Brief History of Web Services<\/h2>\n<p>Web services evolved from the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Remote_procedure_call\" target=\"_blank\" rel=\"noopener\">Remote Procedure Call<\/a> (RPC) mechanism in the\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Distributed_Computing_Environment\" target=\"_blank\" rel=\"noopener\">Distributed Computing Environment<\/a> (DCE) in the early 1990s.\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Common_Object_Request_Broker_Architecture\" target=\"_blank\" rel=\"noopener\">Common Object Request Broker Architecture<\/a>\u00a0(CORBA) and\u00a0<a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/6zzy7zky.aspx\" target=\"_blank\" rel=\"noopener\">Microsoft\u2019s Distributed COM<\/a> are first-generation frameworks for DCE. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Java_remote_method_invocation\" target=\"_blank\" rel=\"noopener\">Java Remote Method Invocation<\/a>\u00a0and <a href=\"https:\/\/www.microsoft.com\/net\" target=\"_blank\" rel=\"noopener\">Microsoft\u2019s DotNet<\/a> are second-generation frameworks for DCE. In 1998, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dave_Winer\" target=\"_blank\" rel=\"noopener\">Dave Winer of the UserLand Software<\/a> developed <a href=\"https:\/\/en.wikipedia.org\/wiki\/XML-RPC\" target=\"_blank\" rel=\"noopener\">XML-RPC<\/a>, a technology innovation that marked the birth of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Web_service\" target=\"_blank\" rel=\"noopener\">web service<\/a>. XML-RPC has two key features:<\/p>\n<ul>\n<li>Use of <a href=\"https:\/\/dzone.com\/articles\/introduction-to-jaxb-20\" target=\"_blank\" rel=\"noopener\">XML marshalling\/unmarshalling<\/a> to achieve language neutrality<\/li>\n<li>Reliance on <a href=\"https:\/\/en.wikipedia.org\/wiki\/Hypertext_Transfer_Protocol\" target=\"_blank\" rel=\"noopener\">HTTP<\/a>\u00a0for a transport layer<\/li>\n<\/ul>\n<p><figure id=\"attachment_59817\" aria-describedby=\"caption-attachment-59817\" style=\"width: 287px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/09\/jax-ws.jpg\"><img decoding=\"async\" class=\"wp-image-59817 size-full\" src=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/09\/jax-ws.jpg\" alt=\"JAX-WS Tutorial - Web Service\" width=\"287\" height=\"443\" srcset=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/09\/jax-ws.jpg 287w, https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/09\/jax-ws-194x300.jpg 194w\" sizes=\"(max-width: 287px) 100vw, 287px\" \/><\/a><figcaption id=\"caption-attachment-59817\" class=\"wp-caption-text\">Figure 1 Web Service<\/figcaption><\/figure><\/p>\n<h2><a name=\"heading3\"><\/a>3. Technologies Used<\/h2>\n<p>The example code in this article was built and run using:<\/p>\n<ul>\n<li>Java 1.8.101<\/li>\n<li>Maven 3.3.9<\/li>\n<li>Eclipse Oxygen<\/li>\n<li>Tomcat 8.0.36<\/li>\n<li>SoapUI 5.2.1<\/li>\n<li>Cucumber 2.3.1<\/li>\n<\/ul>\n<h2><a name=\"heading4\"><\/a>4. Maven Project<\/h2>\n<p><a href=\"https:\/\/maven.apache.org\/\" target=\"_blank\" rel=\"noopener\">Apache Maven<\/a> is a software project management and comprehension tool.\u00a0It manages a project&#8217;s build, reporting, and documentation from a\u00a0project object model (POM) file. In this step,\u00a0I will create a\u00a0<code>jax-ws-tutorial<\/code> Maven project with five modules:<\/p>\n<table>\n<tbody>\n<tr>\n<th><strong>Module<\/strong><\/th>\n<th><strong>Description<\/strong><\/th>\n<th><strong>Note<\/strong><\/th>\n<\/tr>\n<tr>\n<td>bottom-up<\/td>\n<td>Create and publish a web service with the Bottom-up approach.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>employeeWsdlToJava<\/td>\n<td>Use <code>wsimport<\/code> to generate Java stubs from employee.wsdl.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>top-down<\/td>\n<td>Create and publish a web service with the Top-down approach.<\/td>\n<td>depends on <code>employeeWsdlToJava<\/code><\/td>\n<\/tr>\n<tr>\n<td>tomcat-server<\/td>\n<td>Create and publish a web service in tomcat container.<\/td>\n<td>depends on <code>employeeWsdlToJava<\/code><\/td>\n<\/tr>\n<tr>\n<td>soapcClient<\/td>\n<td>Use <code>wsimport<\/code> to generate Java stubs from web services.<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<ol>\n<li>Launch <code>Eclipse<\/code> and click <code>File<\/code>-&gt;<code>New<\/code>-&gt;<code>Maven Project<\/code>.<\/li>\n<li>At the pop-up window, select the <code>POM<\/code> package option, then enter the group Id: <code>jcg.zheng.demo<\/code> and artifact Id: <code>jax-ws-tutorial<\/code>, then click.<code>Finish<\/code>.<\/li>\n<li>You will see the Maven project:\u00a0<code>jax-ws-tutorial<\/code>\u00a0is created.<\/li>\n<li>Click <code>File<\/code>-&gt;<code>New<\/code>-&gt;<code>Maven Module<\/code>.<\/li>\n<li>At the pop-up windows, enter the module name: <code>employeeWsdlToJava<\/code>, then click <code>Finish<\/code>.<\/li>\n<li>You will see the Maven module: <code>employeeWsdlToJava<\/code>is created as a child of\u00a0<code>jax-ws-tutorial<\/code>.<\/li>\n<li>Repeat steps 4 and 5 for\u00a0<code>bottom-up<\/code>, <code>top-down<\/code>, <code>tomcat-server<\/code>\u00a0, and <code>soapClient<\/code>.<\/li>\n<\/ol>\n<h3><a name=\"heading41\"><\/a>4.1 Parent Project<\/h3>\n<p>The generated parent <code>POM.xml<\/code> includes five modules.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>Pom.xml<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\r\n\txmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\r\n\t&lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n\t&lt;groupId&gt;jcg.zheng.demo&lt;\/groupId&gt;\r\n\t&lt;artifactId&gt;jax-ws-tutorial&lt;\/artifactId&gt;\r\n\t&lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\r\n\t&lt;packaging&gt;pom&lt;\/packaging&gt;\r\n\t&lt;modules&gt;\r\n\t\t&lt;module&gt;employeeWsdlToJava&lt;\/module&gt;\r\n\t\t&lt;module&gt;top-down&lt;\/module&gt;\t\r\n\t\t&lt;module&gt;bottom-up&lt;\/module&gt;\t\r\n\t\t&lt;module&gt;tomcat-server&lt;\/module&gt;\r\n\t\t&lt;module&gt;soapClient&lt;\/module&gt;\t\r\n\t&lt;\/modules&gt;\r\n\t&lt;build&gt;\r\n\t\t&lt;plugins&gt;\r\n\t\t\t&lt;plugin&gt;\r\n\t\t\t\t&lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\r\n\t\t\t\t&lt;version&gt;3.5.1&lt;\/version&gt;\r\n\t\t\t\t&lt;configuration&gt;\r\n\t\t\t\t\t&lt;source&gt;1.8&lt;\/source&gt;\r\n\t\t\t\t\t&lt;target&gt;1.8&lt;\/target&gt;\r\n\t\t\t\t&lt;\/configuration&gt;\r\n\t\t\t&lt;\/plugin&gt;\r\n\t\t&lt;\/plugins&gt;\r\n\t&lt;\/build&gt;\r\n&lt;\/project&gt;<\/pre>\n<h2><a name=\"heading5\"><\/a>5. Generated Stubs from Employee WSDL<\/h2>\n<p>JAX-WS provides WSDL-to-Java and Java-to-WSDL mapping tools. In this step, I will use <code>wsimport<\/code> to generate\u00a0Java stubs from the\u00a0<code>employee.wsdl<\/code>\u00a0file. The generated source codes are saved into the <code>src\/main\/java<\/code> folder.\u00a0Here is a quick guide on the mapping:<\/p>\n<table>\n<tbody>\n<tr>\n<th><strong>WSDL<\/strong><\/th>\n<th><strong>Java<\/strong><\/th>\n<\/tr>\n<tr>\n<td>namespace<\/td>\n<td>package<\/td>\n<\/tr>\n<tr>\n<td>portType<\/td>\n<td>SEI<\/td>\n<\/tr>\n<tr>\n<td>operation<\/td>\n<td>method<\/td>\n<\/tr>\n<tr>\n<td>input<\/td>\n<td>parameter<\/td>\n<\/tr>\n<tr>\n<td>output<\/td>\n<td>return<\/td>\n<\/tr>\n<tr>\n<td>xsd:complextType<\/td>\n<td>Java beans<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<br \/>\n<span style=\"text-decoration: underline;\"><em>pom.xml<\/em><\/span><\/p>\n<pre class=\"brush:xml;wrap-lines:false\">&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\r\n\txmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\r\n\t&lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n\t&lt;parent&gt;\r\n\t\t&lt;groupId&gt;jcg.zheng.demo&lt;\/groupId&gt;\r\n\t\t&lt;artifactId&gt;jax-ws-tutorial&lt;\/artifactId&gt;\r\n\t\t&lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\r\n\t&lt;\/parent&gt;\r\n\t&lt;artifactId&gt;employeeWsdlToJava&lt;\/artifactId&gt;\r\n\t&lt;build&gt;\r\n\t\t&lt;plugins&gt;\r\n\t\t\t&lt;plugin&gt;\r\n\t\t\t\t&lt;groupId&gt;org.codehaus.mojo&lt;\/groupId&gt;\r\n\t\t\t\t&lt;artifactId&gt;jaxws-maven-plugin&lt;\/artifactId&gt;\r\n\t\t\t\t&lt;version&gt;2.5&lt;\/version&gt;\r\n\t\t\t\t&lt;executions&gt;\r\n\t\t\t\t\t&lt;execution&gt;\r\n\t\t\t\t\t\t&lt;id&gt;employee_wsdl&lt;\/id&gt;\r\n\t\t\t\t\t\t&lt;configuration&gt;\r\n\t\t\t\t\t\t\t&lt;wsdlDirectory&gt;${basedir}\/src\/main\/resources\/wsdl&lt;\/wsdlDirectory&gt;\r\n\t\t\t\t\t\t\t&lt;wsdlUrls&gt;\r\n\t\t\t\t\t\t\t\t&lt;wsdlUrl&gt;${basedir}\/src\/main\/resources\/wsdl\/employeeService.wsdl&lt;\/wsdlUrl&gt;\r\n\t\t\t\t\t\t\t&lt;\/wsdlUrls&gt;\r\n\t\t\t\t\t\t\t&lt;packageName&gt;jcg.zheng.demo.service.employee.generated&lt;\/packageName&gt;\r\n\t\t\t\t\t\t\t&lt;keep&gt;true&lt;\/keep&gt;\r\n\t\t\t\t\t\t\t&lt;sourceDestDir&gt;${basedir}\/src\/main\/java&lt;\/sourceDestDir&gt;\r\n\t\t\t\t\t\t&lt;\/configuration&gt;\r\n\t\t\t\t\t\t&lt;goals&gt;\r\n\t\t\t\t\t\t\t&lt;goal&gt;wsimport&lt;\/goal&gt;\r\n\t\t\t\t\t\t&lt;\/goals&gt;\r\n\t\t\t\t\t&lt;\/execution&gt;\r\n\t\t\t\t&lt;\/executions&gt;\r\n\t\t\t&lt;\/plugin&gt;\r\n\t\t&lt;\/plugins&gt;\r\n\t&lt;\/build&gt;\r\n\r\n&lt;\/project&gt;<\/pre>\n<p>JAX-WS uses JAXB internally to convert Java objects to and from XMLs. Click <a href=\"https:\/\/examples.javacodegeeks.com\/enterprise-java\/jws\/jax-ws-jaxb-example\/\" target=\"_blank\" rel=\"noopener\">here<\/a>\u00a0to learn more.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>Generated Java Files<\/em><\/span><\/p>\n<pre class=\"brush:bash; wrap-lines:false\">C:\\gitworkspace\\jax-ws-tutorial\\employeeWsdlToJava\\src\\main\\java\\jcg\\zheng\\demo\\service\\employee\\generated&gt;dir\r\n Volume in drive C is OSDisk\r\n Volume Serial Number is 3A10-C6D4\r\n\r\n Directory of C:\\gitworkspace\\jax-ws-tutorial\\employeeWsdlToJava\\src\\main\\java\\jcg\\zheng\\demo\\service\\employee\\generated\r\n\r\n08\/31\/2018  03:57 PM    &lt;DIR&gt;          .\r\n08\/31\/2018  03:57 PM    &lt;DIR&gt;          ..\r\n08\/31\/2018  03:57 PM             1,822 EmployeeIdWrapper.java\r\n08\/31\/2018  03:57 PM             4,116 EmployeeInfo.java\r\n08\/31\/2018  03:57 PM             1,946 EmployeeInfoWrapper.java\r\n08\/31\/2018  03:57 PM             1,287 EmployeeLookupService.java\r\n08\/31\/2018  03:57 PM             3,492 EmployeeLookupService_Service.java\r\n08\/31\/2018  03:57 PM             1,206 EmployeeType.java\r\n08\/31\/2018  03:57 PM             3,524 ObjectFactory.java\r\n08\/31\/2018  03:57 PM               205 package-info.java\r\n08\/31\/2018  03:57 PM             1,207 UserDefinedException.java\r\n08\/31\/2018  03:57 PM             1,438 UserDefinedFault.java\r\n              10 File(s)         20,243 bytes\r\n               2 Dir(s)  21,524,041,728 bytes free\r\n\r\nC:\\gitworkspace\\jax-ws-tutorial\\employeeWsdlToJava\\src\\main\\java\\jcg\\zheng\\demo\\service\\employee\\generated&gt;<\/pre>\n<h2><a name=\"heading6\"><\/a>6. Bottom-Up<\/h2>\n<p>With a Bottom-up approach, developers\u00a0start programming the classes and business logic as Java codes and then generate the WSDL from it. It is easy to develop but hard to maintain as every change at the Java classes will alter the WSDL file. Developers can use a\u00a0<code>wsgen<\/code> command to generate WSDL without publishing the web services.<\/p>\n<p>In this step, I will create a\u00a0<code>HelloworldService<\/code> class, annotate it with <code>@WebService<\/code>, and use <code>wsgen<\/code> to generate WSDL.<\/p>\n<h3><a name=\"heading61\"><\/a>6.1 Pom.xml<\/h3>\n<p>No additional dependency is needed in the <code>pom.xml<\/code>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>pom.xml<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\r\n\txmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\r\n\t&lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n\t&lt;parent&gt;\r\n\t\t&lt;groupId&gt;jcg.zheng.demo&lt;\/groupId&gt;\r\n\t\t&lt;artifactId&gt;jax-ws-tutorial&lt;\/artifactId&gt;\r\n\t\t&lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\r\n\t&lt;\/parent&gt;\r\n\t&lt;artifactId&gt;bottom-up&lt;\/artifactId&gt;\r\n\t&lt;packaging&gt;jar&lt;\/packaging&gt;\r\n\r\n&lt;\/project&gt;<\/pre>\n<h3><a name=\"heading62\"><\/a>6.2 HelloWorldService<\/h3>\n<p>I will annotate the\u00a0<code>HelloWorldServiceImpl<\/code> with <code>@javax.jws.WebService<\/code> and <code>@javax.jws.WebMethod<\/code>.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p><span style=\"text-decoration: underline;\"><em>HelloWorldServiceImpl.java<\/em><\/span><\/p>\n<pre class=\"brush:java\">package jcg.zheng.demo.service.impl;\r\n\r\nimport javax.jws.WebMethod;\r\nimport javax.jws.WebParam;\r\nimport javax.jws.WebService;\r\n\r\nimport jcg.zheng.demo.model.TopNews;\r\n\r\n@WebService\r\npublic class HelloWorldServiceImpl {\r\n\r\n\t@WebMethod\r\n\tpublic String hello(@WebParam(name = \"name\") String name) {\r\n\t\treturn \"Hello \" + name + \"!\";\r\n\t}\r\n\r\n\t@WebMethod\r\n\tpublic TopNews getTopNews() {\r\n\t\tTopNews tn = new TopNews();\r\n\t\ttn.setHighlights(\"Mary Zheng published an example for Jax-ws tutorial.\");\r\n\t\ttn.setTitle(\"Jax-WS Tutorial is Available\");\r\n\t\treturn tn;\r\n\t}\r\n\r\n}\r\n<\/pre>\n<p>The <code>TopNews<\/code> domain model is returned from <code>getTopNews<\/code>, so annotate it with <code>@XmlRootElement<\/code>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>TopNews.java<\/em><\/span><\/p>\n<pre class=\"brush:java\">package jcg.zheng.demo.model;\r\n\r\nimport java.io.Serializable;\r\nimport java.util.Date;\r\n\r\nimport javax.xml.bind.annotation.XmlRootElement;\r\n\r\n@XmlRootElement\r\npublic class TopNews implements Serializable {\r\n\r\n\tprivate static final long serialVersionUID = -7846083786214239318L;\r\n\tprivate String title;\r\n\tprivate String highlights;\r\n\tprivate Date newsDate;\r\n\r\n\tpublic TopNews() {\r\n\t\tsuper();\r\n\t}\r\n\r\n\tpublic String getTitle() {\r\n\t\treturn title;\r\n\t}\r\n\r\n\tpublic void setTitle(String title) {\r\n\t\tthis.title = title;\r\n\t}\r\n\r\n\tpublic String getHighlights() {\r\n\t\treturn highlights;\r\n\t}\r\n\r\n\tpublic void setHighlights(String highlights) {\r\n\t\tthis.highlights = highlights;\r\n\t}\r\n\r\n\tpublic Date getNewsDate() {\r\n\t\treturn newsDate;\r\n\t}\r\n\r\n\tpublic void setNewsDate(Date newsDate) {\r\n\t\tthis.newsDate = newsDate;\r\n\t}\r\n\r\n}\r\n<\/pre>\n<p><strong>Note<\/strong>: Execute <code>wsgen -verbose -keep -cp . jcg.zheng.demo.service.impl.HelloWorldServiceImpl -wsdl<\/code> to generate WSDL.<\/p>\n<h3><a name=\"heading63\"><\/a>6.3 Publish Web Service<\/h3>\n<p>I will create a\u00a0<code>ServerApp<\/code> to invoke <code>javax.xml.ws.Endpopint<\/code> for publishing the <code>HelloWorldServiceImpl<\/code> service to <code>http:\/\/localhost:9980\/helloworld<\/code>. Start it as a Java application.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>ServerApp.java<\/em><\/span><\/p>\n<pre class=\"brush:java\">package jcg.zheng.demo.app;\r\n\r\nimport javax.xml.ws.Endpoint;\r\n\r\nimport jcg.zheng.demo.service.impl.HelloWorldServiceImpl;\r\n\r\npublic class ServerApp {\r\n\tpublic static void main(String[] args) {\r\n\t\tEndpoint.publish(\"http:\/\/localhost:9980\/helloworld\", new HelloWorldServiceImpl());\r\n\t\tSystem.out.println(\"HelloworldServices Started!\");\r\n\t}\r\n}\r\n<\/pre>\n<h3><a name=\"heading64\"><\/a>6.4 Demo with SoapUI<\/h3>\n<p><a href=\"https:\/\/www.soapui.org\/\" target=\"_blank\" rel=\"noopener\">SoapUI<\/a> is a great tool for testing web services. Click <a href=\"https:\/\/www.soapui.org\/downloads\/soapui.html\" target=\"_blank\" rel=\"noopener\">here<\/a> to download it. We started the web services in <a href=\"#heading63\">step 6.3<\/a>. In this step, I will create a new SOAP project:<\/p>\n<ol>\n<li>Click <code>File<\/code>-&gt;<code>New SOAP Project<\/code><\/li>\n<li>Enter the Initial WSDL:\u00a0<code>http:\/\/localhost:9980\/helloworld?wsdl<\/code> and Click <code>OK<\/code><\/li>\n<li>Expand the newly created project, then click <code>employeeLookup<\/code>,\u00a0and\u00a0<code>Request 1<\/code><\/li>\n<li>A SOAP message is populated, replace\u00a0<code>?<\/code> with the test data<\/li>\n<li>Submit the request<\/li>\n<li>A response XML is returned.<\/li>\n<\/ol>\n<p><span style=\"text-decoration: underline;\"><em>SoapUI Input<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;soapenv:Envelope xmlns:soapenv=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\" xmlns:impl=\"http:\/\/impl.service.demo.zheng.jcg\/\"&gt;\r\n   &lt;soapenv:Header\/&gt;\r\n   &lt;soapenv:Body&gt;\r\n      &lt;impl:hello&gt;\r\n         &lt;!--Optional:--&gt;\r\n         &lt;name&gt;Mary&lt;\/name&gt;\r\n      &lt;\/impl:hello&gt;\r\n   &lt;\/soapenv:Body&gt;\r\n&lt;\/soapenv:Envelope&gt;<\/pre>\n<p><span style=\"text-decoration: underline;\"><em>SoapUI Output<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;S:Envelope xmlns:S=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"&gt;\r\n   &lt;S:Body&gt;\r\n      &lt;ns2:helloResponse xmlns:ns2=\"http:\/\/impl.service.demo.zheng.jcg\/\"&gt;\r\n         &lt;return&gt;Hello Mary!&lt;\/return&gt;\r\n      &lt;\/ns2:helloResponse&gt;\r\n   &lt;\/S:Body&gt;\r\n&lt;\/S:Envelope&gt;<\/pre>\n<h2><a name=\"heading7\"><\/a>7. Top-Down<\/h2>\n<p>With a Top-down approach, developers start with the WSDL file and generate the Java Stubs with <code>wsimport<\/code>. In this step, I will create <code>EmployeeLookupServiceImpl_WSDL<\/code> from the generated stubs in <a href=\"#heading5\">step 5<\/a>.<\/p>\n<h3><a name=\"heading71\"><\/a>7.1 Pom.xml<\/h3>\n<p>I will include <code>employeeWsdlToJava<\/code> as a dependency.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>pom.xml<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\r\n\txmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\r\n\t&lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n\t&lt;parent&gt;\r\n\t\t&lt;groupId&gt;jcg.zheng.demo&lt;\/groupId&gt;\r\n\t\t&lt;artifactId&gt;jax-ws-tutorial&lt;\/artifactId&gt;\r\n\t\t&lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\r\n\t&lt;\/parent&gt;\r\n\t&lt;artifactId&gt;top-down&lt;\/artifactId&gt;\r\n\r\n\t&lt;dependencies&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;jcg.zheng.demo&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;employeeWsdlToJava&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;${project.version}&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t&lt;\/dependencies&gt;\r\n\r\n&lt;\/project&gt;<\/pre>\n<h3><a name=\"heading72\"><\/a>7.2 EmployeeLookupService<\/h3>\n<p>I will create an implementation class: <code>EmployeeLookupServiceImpl_WSDL<\/code> which implements <code>EmployeeLookupService<\/code> and annotates it with\u00a0<code>@WebService<\/code> and sets the <code>endpointInterface<\/code> value as <code>jcg.zheng.demo.service.employee.generated.EmployeeLookupService<\/code>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>EmployeeLookupServiceImpl_WSDL .java<\/em><\/span><\/p>\n<pre class=\"brush:java\">package jcg.zheng.demo.service.employee.impl;\r\n\r\nimport java.math.BigDecimal;\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\nimport java.util.Random;\r\n\r\nimport javax.jws.WebService;\r\n\r\nimport jcg.zheng.demo.service.employee.generated.EmployeeIdWrapper;\r\nimport jcg.zheng.demo.service.employee.generated.EmployeeInfo;\r\nimport jcg.zheng.demo.service.employee.generated.EmployeeInfoWrapper;\r\nimport jcg.zheng.demo.service.employee.generated.EmployeeLookupService;\r\nimport jcg.zheng.demo.service.employee.generated.EmployeeType;\r\nimport jcg.zheng.demo.service.employee.generated.ObjectFactory;\r\nimport jcg.zheng.demo.service.employee.generated.UserDefinedException;\r\nimport jcg.zheng.demo.service.employee.generated.UserDefinedFault;\r\n\r\n@WebService(endpointInterface = \"jcg.zheng.demo.service.employee.generated.EmployeeLookupService\")\r\npublic class EmployeeLookupServiceImpl_WSDL implements EmployeeLookupService {\r\n\tObjectFactory of = new ObjectFactory();\r\n\r\n\t@Override\r\n\tpublic EmployeeInfoWrapper employeeLookup(EmployeeIdWrapper employeeIdList) throws UserDefinedException {\r\n\t\tif (employeeIdList.getEid().isEmpty()) {\r\n\t\t\tUserDefinedFault e = of.createUserDefinedFault();\r\n\t\t\te.setMessage(\"Empty Employee ID\");\r\n\r\n\t\t\tthrow new UserDefinedException(\"Please enter at lease one employee Id\", e);\r\n\t\t}\r\n\r\n\t\tEmployeeInfoWrapper eWrapper = of.createEmployeeInfoWrapper();\r\n\r\n\t\tList allEmps = getEmployees(employeeIdList.getEid());\r\n\r\n\t\teWrapper.getEmployeeInfo().addAll(allEmps);\r\n\r\n\t\treturn eWrapper;\r\n\t}\r\n\r\n\tprivate List getEmployees(List ids) {\r\n\r\n\t\tList emps = new ArrayList&lt;&gt;();\r\n\t\tfor (String id : ids) {\r\n\t\t\temps.add(buildDummyEmployee(id, EmployeeType.HOURLY));\r\n\t\t}\r\n\r\n\t\treturn emps;\r\n\t}\r\n\r\n\tprivate EmployeeInfo buildDummyEmployee(String id, EmployeeType type) {\r\n\t\tEmployeeInfo emp = of.createEmployeeInfo();\r\n\t\temp.setEid(id);\r\n\t\tRandom rand = new Random();\r\n\t\temp.setFirstName(\"FName_\" + id);\r\n\t\temp.setLastName(\"LName_\" + id);\r\n\t\temp.setType(type);\r\n\t\temp.setHourlyRate(new BigDecimal(rand.nextInt(40)));\r\n\t\treturn emp;\r\n\t}\r\n\r\n}\r\n<\/pre>\n<h3><a name=\"heading73\"><\/a>7.3 Publish Web Service<\/h3>\n<p>JAX-WS <code>Endpoint<\/code>\u00a0class&#8217;s <code>publish<\/code> method\u00a0is used to deploy the services to the address. In this step, we will publish <code>EmployeeLookupServiceImpl_WSDL<\/code> at <code>http:\/\/localhost:9990\/EmployeeLookupService<\/code>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>ServerApp.java<\/em><\/span><\/p>\n<pre class=\"brush:java\">package jcg.zheng.demo.service.employee.impl;\r\n\r\nimport javax.xml.ws.Endpoint;\r\n\r\npublic class ServerApp {\r\n\tpublic static void main(String[] args) {\r\n\t\tEndpoint.publish(\"http:\/\/localhost:9990\/EmployeeLookupService\", new EmployeeLookupServiceImpl_WSDL());\r\n\r\n\t\tSystem.out.println(\"EmployeeLookupService Started!\");\r\n\t}\r\n\r\n}\r\n<\/pre>\n<h3><a name=\"heading74\"><\/a>7.4 Demo with SoapUI<\/h3>\n<p>Repeat <a href=\"#heading64\">step 6.4<\/a> for <code>http:\/\/localhost:9990\/EmployeeLookupService?wsdl<\/code> and capture the SoapUI input and output:<\/p>\n<p><span style=\"text-decoration: underline;\"><em>Soap Request<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;soapenv:Envelope xmlns:soapenv=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\" xmlns:emp=\"http:\/\/bestpay.payroll\/employee\"&gt;\r\n   &lt;soapenv:Header\/&gt;\r\n   &lt;soapenv:Body&gt;\r\n      &lt;emp:EmployeeIdList&gt;\r\n         &lt;!--Zero or more repetitions:--&gt;\r\n         &lt;emp:eid&gt;12&lt;\/emp:eid&gt;\r\n      &lt;\/emp:EmployeeIdList&gt;\r\n   &lt;\/soapenv:Body&gt;\r\n&lt;\/soapenv:Envelope&gt;<\/pre>\n<p><span style=\"text-decoration: underline;\"><em>Soap Response<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;S:Envelope xmlns:S=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"&gt;\r\n   &lt;S:Body&gt;\r\n      &lt;EmployeeInfoList xmlns=\"http:\/\/bestpay.payroll\/employee\"&gt;\r\n         &lt;employeeInfo&gt;\r\n            &lt;eid&gt;12&lt;\/eid&gt;\r\n            &lt;firstName&gt;FName_12&lt;\/firstName&gt;\r\n            &lt;lastName&gt;LName_12&lt;\/lastName&gt;\r\n            &lt;hourlyRate&gt;33&lt;\/hourlyRate&gt;\r\n            &lt;type&gt;Hourly&lt;\/type&gt;\r\n         &lt;\/employeeInfo&gt;\r\n      &lt;\/EmployeeInfoList&gt;\r\n   &lt;\/S:Body&gt;\r\n&lt;\/S:Envelope&gt;<\/pre>\n<h2><a name=\"heading8\"><\/a>8.\u00a0Tomcat Server<\/h2>\n<p>In this step, I will deploy the JAX-WS web service into a Tomcat container.<\/p>\n<h3><a name=\"heading81\"><\/a>8.1 Pom.xml<\/h3>\n<p>There are several dependencies must be included in order to deploy the web services into a tomcat container.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>Pom.xml<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\r\n\txmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\r\n\t&lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n\t&lt;parent&gt;\r\n\t\t&lt;groupId&gt;jcg.zheng.demo&lt;\/groupId&gt;\r\n\t\t&lt;artifactId&gt;jax-ws-tutorial&lt;\/artifactId&gt;\r\n\t\t&lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\r\n\t&lt;\/parent&gt;\r\n\t&lt;artifactId&gt;tomcat-server&lt;\/artifactId&gt;\r\n\r\n\t&lt;dependencies&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;jcg.zheng.demo&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;employeeWsdlToJava&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;${project.version}&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\r\n\t\t&lt;!-- jax-ws maven dependency --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;com.sun.xml.ws&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;jaxws-rt&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;2.2.8&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;!-- servlet provided by tomcat --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;javax.servlet&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;javax.servlet-api&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;3.1.0&lt;\/version&gt;\r\n\t\t\t&lt;scope&gt;provided&lt;\/scope&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;!-- https:\/\/mvnrepository.com\/artifact\/com.sun.xml.bind\/jaxb-core --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;com.sun.xml.bind&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;jaxb-core&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;2.2.7&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;com.sun.xml.stream.buffer&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;streambuffer&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;1.5.3&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;!-- https:\/\/mvnrepository.com\/artifact\/com.sun.xml.bind\/jaxb-impl --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;com.sun.xml.bind&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;jaxb-impl&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;2.2.7&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;!-- https:\/\/mvnrepository.com\/artifact\/com.sun.xml.ws\/policy --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;com.sun.xml.ws&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;policy&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;2.3.1&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.glassfish.gmbal&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;gmbal-api-only&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;3.2.0-b003&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;!-- https:\/\/mvnrepository.com\/artifact\/org.glassfish.ha\/ha-api --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.glassfish.ha&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;ha-api&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;3.1.9&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t&lt;\/dependencies&gt;\r\n\t&lt;packaging&gt;war&lt;\/packaging&gt;\r\n&lt;\/project&gt;<\/pre>\n<h3><a name=\"heading82\"><\/a>8.2 EmployeeService<\/h3>\n<p>I will create an\u00a0<code>EmployeeServiceImpl<\/code> and annotate it with <code>@WebService<\/code>. This step is the same as <a href=\"#heading72\">step 7.2<\/a>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>EmployeeServiceImpl.java<\/em><\/span><\/p>\n<pre class=\"brush:java\">package jcg.zheng.demo.service;\r\n\r\nimport java.math.BigDecimal;\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\nimport java.util.Random;\r\n\r\nimport javax.jws.WebService;\r\n\r\nimport jcg.zheng.demo.service.employee.generated.EmployeeIdWrapper;\r\nimport jcg.zheng.demo.service.employee.generated.EmployeeInfo;\r\nimport jcg.zheng.demo.service.employee.generated.EmployeeInfoWrapper;\r\nimport jcg.zheng.demo.service.employee.generated.EmployeeLookupService;\r\nimport jcg.zheng.demo.service.employee.generated.EmployeeType;\r\nimport jcg.zheng.demo.service.employee.generated.ObjectFactory;\r\nimport jcg.zheng.demo.service.employee.generated.UserDefinedException;\r\nimport jcg.zheng.demo.service.employee.generated.UserDefinedFault;\r\n\r\n@WebService(endpointInterface = \"jcg.zheng.demo.service.employee.generated.EmployeeLookupService\")\r\npublic class EmployeeServiceImpl implements EmployeeLookupService {\r\n\tObjectFactory of = new ObjectFactory();\r\n\r\n\t@Override\r\n\tpublic EmployeeInfoWrapper employeeLookup(EmployeeIdWrapper employeeIdList) throws UserDefinedException {\r\n\t\tif (employeeIdList.getEid().isEmpty()) {\r\n\t\t\tUserDefinedFault e = of.createUserDefinedFault();\r\n\t\t\te.setMessage(\"Empty Employee ID\");\r\n\r\n\t\t\tthrow new UserDefinedException(\"Please enter at lease one employee Id\", e);\r\n\t\t}\r\n\r\n\t\tEmployeeInfoWrapper eWrapper = of.createEmployeeInfoWrapper();\r\n\r\n\t\tList allEmps = getEmployees(employeeIdList.getEid());\r\n\r\n\t\teWrapper.getEmployeeInfo().addAll(allEmps);\r\n\r\n\t\treturn eWrapper;\r\n\t}\r\n\r\n\tprivate List getEmployees(List ids) {\r\n\r\n\t\tList emps = new ArrayList();\r\n\t\tfor (String id : ids) {\r\n\t\t\temps.add(buildDummyEmployee(id, EmployeeType.HOURLY));\r\n\t\t}\r\n\r\n\t\treturn emps;\r\n\t}\r\n\r\n\tprivate EmployeeInfo buildDummyEmployee(String id, EmployeeType type) {\r\n\t\tEmployeeInfo emp = of.createEmployeeInfo();\r\n\t\temp.setEid(id);\r\n\t\tRandom rand = new Random();\r\n\t\temp.setFirstName(\"FName_\" + id);\r\n\t\temp.setLastName(\"LName_\" + id);\r\n\t\temp.setType(type);\r\n\t\temp.setHourlyRate(new BigDecimal(rand.nextInt(40)));\r\n\t\treturn emp;\r\n\t}\r\n\r\n}\r\n<\/pre>\n<h3><a name=\"heading83\"><\/a>8.3 Web Configuration<\/h3>\n<p>In this step, I will configure both <code>sun-jaxws.xml<\/code> and <code>web.xml<\/code>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>sun-jaxws.xml<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;endpoints\r\n\txmlns=\"http:\/\/java.sun.com\/xml\/ns\/jax-ws\/ri\/runtime\" version=\"2.0\"&gt;\r\n\t&lt;endpoint name=\"EmployeeServiceImpl\"\r\n\t\timplementation=\"jcg.zheng.demo.service.EmployeeServiceImpl\"\r\n\t\turl-pattern=\"\/employeeWS\" \/&gt;\r\n&lt;\/endpoints&gt;<\/pre>\n<p><span style=\"text-decoration: underline;\"><em>web.xml<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;web-app xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n\txmlns=\"http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\"\r\n\txsi:schemaLocation=\"http:\/\/xmlns.jcp.org\/xml\/ns\/javaee http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\/web-app_3_1.xsd\"\r\n\tid=\"WebApp_ID\" version=\"3.1\"&gt;\r\n\t\r\n\t&lt;listener&gt;\r\n\t\t&lt;listener-class&gt;\r\n\t\t\tcom.sun.xml.ws.transport.http.servlet.WSServletContextListener&lt;\/listener-class&gt;\r\n\t&lt;\/listener&gt;\r\n\t\r\n\t&lt;servlet&gt;\r\n\t\t&lt;servlet-name&gt;JAXWSServlet&lt;\/servlet-name&gt;\r\n\t\t&lt;servlet-class&gt;com.sun.xml.ws.transport.http.servlet.WSServlet&lt;\/servlet-class&gt;\r\n\t\t&lt;load-on-startup&gt;1&lt;\/load-on-startup&gt;\r\n\t&lt;\/servlet&gt;\r\n\t&lt;servlet-mapping&gt;\r\n\t\t&lt;servlet-name&gt;JAXWSServlet&lt;\/servlet-name&gt;\r\n\t\t&lt;url-pattern&gt;\/*&lt;\/url-pattern&gt;\r\n\t&lt;\/servlet-mapping&gt;\r\n\t&lt;session-config&gt;\r\n\t\t&lt;session-timeout&gt;30&lt;\/session-timeout&gt;\r\n\t&lt;\/session-config&gt;\r\n\t\r\n&lt;\/web-app&gt;\r\n<\/pre>\n<h3><a name=\"heading84\"><\/a>8.4 Start the Web Services<\/h3>\n<p>Deploy <code>tomcat-server-0.0.1-SNAPSHOT.war<\/code> to a tomcat server. Start the tomcat instance and verify <code>EmployeeService<\/code> is up by browsing to <code>http:\/\/localhost:8080\/tomcat-server\/employeeWS?wsdl<\/code>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>Tomcat Server Log<\/em><\/span><\/p>\n<pre class=\"brush:bash\">Aug 31, 2018 8:44:53 PM org.apache.jasper.servlet.TldScanner scanJars\r\nINFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.\r\nAug 31, 2018 8:44:55 PM com.sun.xml.ws.transport.http.servlet.WSServletDelegate \r\nINFO: WSSERVLET14: JAX-WS servlet initializing\r\nAug 31, 2018 8:44:55 PM com.sun.xml.ws.transport.http.servlet.WSServletContextListener contextInitialized\r\nINFO: WSSERVLET12: JAX-WS context listener initializing\r\nAug 31, 2018 8:44:55 PM com.sun.xml.ws.transport.http.servlet.WSServletContextListener contextInitialized\r\nINFO: WSSERVLET12: JAX-WS context listener initializing\r\nAug 31, 2018 8:44:55 PM org.apache.coyote.AbstractProtocol start\r\nINFO: Starting ProtocolHandler [http-nio-8080]\r\nAug 31, 2018 8:44:55 PM org.apache.coyote.AbstractProtocol start\r\nINFO: Starting ProtocolHandler [ajp-nio-8009]\r\nAug 31, 2018 8:44:55 PM org.apache.catalina.startup.Catalina start\r\nINFO: Server startup in 17520 ms<\/pre>\n<h2><a name=\"heading9\"><\/a>9.\u00a0SOAP Client<\/h2>\n<p>Consuming a web service is very easy with the JAX-WS. We will generate\u00a0the java stubs and use the generated class which is annotated with <code>@WebServiceClient<\/code> to consume the services.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>pom.xml<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\r\n  &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n  &lt;parent&gt;\r\n    &lt;groupId&gt;jcg.zheng.demo&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;jax-ws-tutorial&lt;\/artifactId&gt;\r\n    &lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\r\n  &lt;\/parent&gt;\r\n  &lt;artifactId&gt;soapClient&lt;\/artifactId&gt;\r\n  \r\n  &lt;dependencies&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;io.cucumber&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;cucumber-java&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;2.3.1&lt;\/version&gt;\r\n\t\t\t&lt;scope&gt;test&lt;\/scope&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;io.cucumber&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;cucumber-junit&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;2.3.1&lt;\/version&gt;\r\n\t\t\t&lt;scope&gt;test&lt;\/scope&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;junit&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;junit&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;4.12&lt;\/version&gt;\r\n\t\t\t&lt;scope&gt;test&lt;\/scope&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t&lt;\/dependencies&gt;\r\n\t\r\n\t&lt;build&gt;\r\n\t\t&lt;plugins&gt;\r\n\t\t\t&lt;plugin&gt;\r\n\t\t\t\t&lt;groupId&gt;org.codehaus.mojo&lt;\/groupId&gt;\r\n\t\t\t\t&lt;artifactId&gt;jaxws-maven-plugin&lt;\/artifactId&gt;\r\n\t\t\t\t&lt;version&gt;2.5&lt;\/version&gt;\r\n\t\t\t\t&lt;executions&gt;\r\n\t\t\t\t\t&lt;execution&gt;\r\n\t\t\t\t\t\t&lt;id&gt;helloworld_wsdl&lt;\/id&gt;\r\n\t\t\t\t\t\t&lt;goals&gt;\r\n\t\t\t\t\t\t\t&lt;goal&gt;wsimport&lt;\/goal&gt;\r\n\t\t\t\t\t\t&lt;\/goals&gt;\r\n\t\t\t\t\t\t&lt;configuration&gt;\r\n\t\t\t\t\t\t\t&lt;wsdlUrls&gt;\r\n\t\t\t\t\t\t\t\t&lt;wsdlUrl&gt;http:\/\/localhost:9980\/helloworld?wsdl&lt;\/wsdlUrl&gt;\r\n\t\t\t\t\t\t\t&lt;\/wsdlUrls&gt;\r\n\t\t\t\t\t\t\t&lt;keep&gt;true&lt;\/keep&gt;\r\n\t\t\t\t\t\t\t&lt;packageName&gt;jcg.demo.jaxws.client.helloworld&lt;\/packageName&gt;\r\n\t\t\t\t\t\t\t&lt;sourceDestDir&gt;${basedir}\/src\/main\/generated&lt;\/sourceDestDir&gt;\r\n\t\t\t\t\t\t&lt;\/configuration&gt;\r\n\t\t\t\t\t&lt;\/execution&gt;\r\n\t\t\t\t\t&lt;execution&gt;\r\n\t\t\t\t\t\t&lt;id&gt;employee_wsdl&lt;\/id&gt;\r\n\t\t\t\t\t\t&lt;goals&gt;\r\n\t\t\t\t\t\t\t&lt;goal&gt;wsimport&lt;\/goal&gt;\r\n\t\t\t\t\t\t&lt;\/goals&gt;\r\n\t\t\t\t\t\t&lt;configuration&gt;\r\n\t\t\t\t\t\t\t&lt;wsdlUrls&gt;\r\n\t\t\t\t\t\t\t\t&lt;wsdlUrl&gt;http:\/\/localhost:9990\/EmployeeLookupService?wsdl&lt;\/wsdlUrl&gt;\r\n\t\t\t\t\t\t\t&lt;\/wsdlUrls&gt;\r\n\t\t\t\t\t\t\t&lt;keep&gt;true&lt;\/keep&gt;\r\n\t\t\t\t\t\t\t&lt;packageName&gt;jcg.demo.jaxws.client.employee&lt;\/packageName&gt;\r\n\t\t\t\t\t\t\t&lt;sourceDestDir&gt;${basedir}\/src\/main\/generated&lt;\/sourceDestDir&gt;\r\n\t\t\t\t\t\t&lt;\/configuration&gt;\r\n\t\t\t\t\t&lt;\/execution&gt;\r\n\t\t\t\t&lt;\/executions&gt;\r\n\t\t\t&lt;\/plugin&gt;\r\n\t\t&lt;\/plugins&gt;\r\n\t&lt;\/build&gt;\r\n\r\n\t&lt;profiles&gt;\r\n\t\t&lt;profile&gt;\r\n\t\t\t&lt;id&gt;cucumber&lt;\/id&gt;\r\n\t\t\t&lt;build&gt;\r\n\t\t\t\t&lt;plugins&gt;\r\n\t\t\t\t\t&lt;plugin&gt;\r\n\t\t\t\t\t\t&lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\r\n\t\t\t\t\t\t&lt;artifactId&gt;maven-surefire-plugin&lt;\/artifactId&gt;\r\n\t\t\t\t\t\t&lt;version&gt;2.9&lt;\/version&gt;\r\n\t\t\t\t\t\t&lt;configuration&gt;\r\n\t\t\t\t\t\t\t&lt;includes&gt;\r\n\t\t\t\t\t\t\t\t&lt;include&gt;**\/RunCukesTest.java&lt;\/include&gt;\r\n\t\t\t\t\t\t\t&lt;\/includes&gt;\r\n\t\t\t\t\t\t\t&lt;skipAfterFailureCount&gt;1&lt;\/skipAfterFailureCount&gt;\r\n\t\t\t\t\t\t&lt;\/configuration&gt;\r\n\t\t\t\t\t&lt;\/plugin&gt;\r\n\t\t\t\t&lt;\/plugins&gt;\r\n\t\t\t&lt;\/build&gt;\r\n\t\t&lt;\/profile&gt;\r\n\t&lt;\/profiles&gt;\r\n&lt;\/project&gt;\r\n\r\n<\/pre>\n<h3><a name=\"heading91\"><\/a>9.1 Generate Stubs<\/h3>\n<p>Here are the generated Java files for <code>HelloWorldService<\/code>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>Generated Stub for HelloworldService<\/em><\/span><\/p>\n<pre class=\"brush:xml\">C:\\gitworkspace\\jax-ws-tutorial\\soapClient\\src\\main\\generated\\jcg\\demo\\jaxws\\client\\helloworld&gt;dir\r\n Volume in drive C is OSDisk\r\n Volume Serial Number is 3A10-C6D4\r\n\r\n Directory of C:\\gitworkspace\\jax-ws-tutorial\\soapClient\\src\\main\\generated\\jcg\\demo\\jaxws\\client\\helloworld\r\n\r\n08\/31\/2018  04:59 PM    &lt;DIR&gt;          .\r\n08\/31\/2018  04:59 PM    &lt;DIR&gt;          ..\r\n08\/31\/2018  04:59 PM               756 GetTopNews.java\r\n08\/31\/2018  04:59 PM             1,521 GetTopNewsResponse.java\r\n08\/31\/2018  04:59 PM             1,358 Hello.java\r\n08\/31\/2018  04:59 PM             1,492 HelloResponse.java\r\n08\/31\/2018  04:59 PM             2,114 HelloWorldServiceImpl.java\r\n08\/31\/2018  04:59 PM             3,504 HelloWorldServiceImplService.java\r\n08\/31\/2018  04:59 PM             4,445 ObjectFactory.java\r\n08\/31\/2018  04:59 PM               132 package-info.java\r\n08\/31\/2018  04:59 PM             2,884 TopNews.java\r\n               9 File(s)         18,206 bytes\r\n               2 Dir(s)  21,555,847,168 bytes free\r\n\r\nC:\\gitworkspace\\jax-ws-tutorial\\soapClient\\src\\main\\generated\\jcg\\demo\\jaxws\\client\\helloworld&gt;<\/pre>\n<p>Here are the generated Java files for <code>EmployeeService<\/code>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>Generated Stub for EmployeeService<\/em><\/span><\/p>\n<pre class=\"brush:xml\">C:\\gitworkspace\\jax-ws-tutorial\\soapClient\\src\\main\\generated\\jcg\\demo\\jaxws\\client\\employee&gt;dir\r\n Volume in drive C is OSDisk\r\n Volume Serial Number is 3A10-C6D4\r\n\r\n Directory of C:\\gitworkspace\\jax-ws-tutorial\\soapClient\\src\\main\\generated\\jcg\\demo\\jaxws\\client\\employee\r\n\r\n08\/31\/2018  04:59 PM    &lt;DIR&gt;          .\r\n08\/31\/2018  04:59 PM    &lt;DIR&gt;          ..\r\n08\/31\/2018  04:59 PM             1,888 EmployeeIdWrapper.java\r\n08\/31\/2018  04:59 PM             3,981 EmployeeInfo.java\r\n08\/31\/2018  04:59 PM             2,015 EmployeeInfoWrapper.java\r\n08\/31\/2018  04:59 PM             1,675 EmployeeLookupService.java\r\n08\/31\/2018  04:59 PM             3,782 EmployeeLookupServiceImplWSDLService.java\r\n\r\n08\/31\/2018  04:59 PM             1,195 EmployeeType.java\r\n08\/31\/2018  04:59 PM             3,491 ObjectFactory.java\r\n08\/31\/2018  04:59 PM               194 package-info.java\r\n08\/31\/2018  04:59 PM             1,185 UserDefinedException.java\r\n08\/31\/2018  04:59 PM             1,427 UserDefinedFault.java\r\n              10 File(s)         20,833 bytes\r\n               2 Dir(s)  21,555,965,952 bytes free\r\n\r\nC:\\gitworkspace\\jax-ws-tutorial\\soapClient\\src\\main\\generated\\jcg\\demo\\jaxws\\client\\employee&gt;<\/pre>\n<h3><a name=\"heading92\"><\/a>9.2 Create Client Service<\/h3>\n<p>In this step, I will create a client service with the desired WSDL endpoint URL<\/p>\n<p><span style=\"text-decoration: underline;\"><em>EmployeeServiceclient.java<\/em><\/span><\/p>\n<pre class=\"brush:java\">package jcg.zheng.demo.service.client;\r\n\r\nimport java.net.MalformedURLException;\r\nimport java.net.URL;\r\n\r\nimport jcg.demo.jaxws.client.employee.*;\r\n\r\npublic class EmployeeServiceClient {\r\n\r\n\tprivate String serviceUrl;\r\n\t\r\n\tpublic EmployeeServiceClient(String serviceUrl) {\r\n\t\tsuper();\r\n\t\tthis.serviceUrl = serviceUrl;\r\n\t}\r\n\t\r\n\tpublic EmployeeInfoWrapper employeeLookup(EmployeeIdWrapper employeeIdList) throws UserDefinedException {\r\n\r\n\t\ttry {\r\n\t\t\tURL url = new URL(serviceUrl);\r\n\t\t\tEmployeeLookupServiceImplWSDLService empService = new EmployeeLookupServiceImplWSDLService(url);\r\n\r\n\t\t\tEmployeeLookupService eSrc = empService.getEmployeeLookupServiceImplWSDLPort();\r\n\r\n\t\t\treturn eSrc.employeeLookup(employeeIdList);\r\n\t\t} catch (MalformedURLException e) {\r\n\t\t\tUserDefinedFault fault = new UserDefinedFault();\r\n\t\t\tfault.setMessage(e.getMessage());\r\n\t\t\tthrow new UserDefinedException(\"caught MalformedURLException. \", fault);\r\n\t\t}\r\n\r\n\t}\r\n}\r\n<\/pre>\n<p><span style=\"text-decoration: underline;\"><em>HelloServiceClient .java<\/em><\/span><\/p>\n<pre class=\"brush:java\">package jcg.zheng.demo.service.client;\r\n\r\nimport java.net.MalformedURLException;\r\nimport java.net.URL;\r\n\r\nimport jcg.demo.jaxws.client.helloworld.HelloWorldServiceImpl;\r\nimport jcg.demo.jaxws.client.helloworld.HelloWorldServiceImplService;\r\nimport jcg.demo.jaxws.client.helloworld.TopNews;\r\n\r\npublic class HelloServiceClient {\r\n\r\n\tpublic TopNews getTopNews() throws MalformedURLException {\r\n\r\n\t\tURL url = new URL(\"http:\/\/localhost:9980\/helloworld?wsdl\");\r\n\t\tHelloWorldServiceImplService service = new HelloWorldServiceImplService(url);\r\n\t\tHelloWorldServiceImpl eSrc = service.getHelloWorldServiceImplPort();\r\n\r\n\t\treturn eSrc.getTopNews();\r\n\t}\r\n}\r\n<\/pre>\n<p><strong>Note<\/strong>: When the web service changes its WSDL, then clients must regenerate the Java stubs. I wrote <a href=\"https:\/\/examples.javacodegeeks.com\/enterprise-java\/jws\/jax-ws-dynamic-proxy-client-example\/\" target=\"_blank\" rel=\"noopener\">another article<\/a> for a dynamic web service client.\u00a0Web services may take a long time to complete.\u00a0Clients can use a callback to perform other tasks while waiting for the response. Click <a href=\"https:\/\/examples.javacodegeeks.com\/enterprise-java\/jws\/jax-ws-callback-example\/\" target=\"_blank\" rel=\"noopener\">here<\/a>\u00a0for more details.<\/p>\n<h3><a name=\"heading93\"><\/a>9.3 JUnit Tests<\/h3>\n<p>In this step, I will create a JUnit test for <code>EmployeeServiceClient<\/code>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>EmployeeServiceClientTest.java<\/em><\/span><\/p>\n<pre class=\"brush:java\">package jcg.zheng.demo.service.client;\r\n\r\nimport static org.junit.Assert.assertEquals;\r\n\r\nimport org.junit.Test;\r\n\r\nimport jcg.demo.jaxws.client.employee.*;\r\n\r\npublic class EmployeeServiceClientTest {\r\n\tprivate EmployeeServiceClient client = new EmployeeServiceClient(\r\n\t\t\t\"http:\/\/localhost:9990\/EmployeeLookupService?wsdl\");\r\n\r\n\t@Test\r\n\tpublic void employeeLookup_found() throws UserDefinedException {\r\n\t\tEmployeeIdWrapper employeeIdList = new EmployeeIdWrapper();\r\n\t\temployeeIdList.getEid().add(\"100\");\r\n\t\tEmployeeInfoWrapper ret = client.employeeLookup(employeeIdList);\r\n\t\tassertEquals(1, ret.getEmployeeInfo().size());\r\n\t\tassertEquals(\"100\", ret.getEmployeeInfo().get(0).getEid());\r\n\t}\r\n\t\r\n\t@Test(expected=UserDefinedException.class)\r\n\tpublic void employeeLookup_not_found() throws UserDefinedException {\r\n\t\tEmployeeIdWrapper employeeIdList = new EmployeeIdWrapper();\t \r\n\t\tclient.employeeLookup(employeeIdList);\t\t \r\n\t}\r\n\r\n}\r\n<\/pre>\n<h3><a name=\"heading94\"><\/a>9.4 Acceptance Tests<\/h3>\n<p>I will create two cucumber tests which generates a <code>HTML<\/code> report.<\/p>\n<h4>9.4.1 Feature Files<\/h4>\n<p>Cucumber feature files are easy to read and communicates better with business than JUnit tests.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>Employee Feature<\/em><\/span><\/p>\n<pre class=\"brush:xml\">Feature: Employee Look Up Service \r\n@Employee @SMOKE\r\nScenario Outline:\t\r\n\tWhen invoking employeeLookupService  \r\n\tThen should find the employee from the response \r\n\t\r\n\tExamples: \r\n\t\t| empId |\r\n\t\t| 12    | \r\n\t\t\r\n<\/pre>\n<p><span style=\"text-decoration: underline;\"><em>Hello Feature<\/em><\/span><\/p>\n<pre class=\"brush:xml\">Feature: HelloWorld Service \r\n@Helloworld @SMOKE\r\nScenario: \t\r\n\tWhen invoking getTopNew\r\n\tThen the response code should be ok<\/pre>\n<h4>9.4.2 Step Definitions<\/h4>\n<p>I will create a Java class to handle the step defintions.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>Hello Feature<\/em><\/span><\/p>\n<pre class=\"brush:java\">package jcg.demo.servicetest.step;\r\n\r\nimport static org.junit.Assert.assertEquals;\r\nimport static org.junit.Assert.assertNotNull;\r\n\r\nimport cucumber.api.java.en.Then;\r\nimport cucumber.api.java.en.When;\r\nimport jcg.demo.jaxws.client.employee.EmployeeIdWrapper;\r\nimport jcg.demo.jaxws.client.employee.EmployeeInfoWrapper;\r\nimport jcg.zheng.demo.service.client.EmployeeServiceClient;\r\n\r\npublic class EmployeeServiceStep {\r\n\tEmployeeServiceClient emClient = new EmployeeServiceClient(\"http:\/\/localhost:9990\/EmployeeLookupService?wsdl\");\r\n\tprivate EmployeeInfoWrapper serviceResponse;\r\n\r\n\t@When(\"^invoking employeeLookupService (.+)$\")\r\n\tpublic void invoking_employeeLookupService(String empId) throws Exception {\r\n\r\n\t\tEmployeeIdWrapper employeeIdList = new EmployeeIdWrapper();\r\n\t\temployeeIdList.getEid().add(empId);\r\n\t\tserviceResponse = emClient.employeeLookup(employeeIdList);\r\n\r\n\t}\r\n\r\n\t@Then(\"^should find the employee from the response$\")\r\n\tpublic void the_response_code_should_find_the_employee() throws Exception {\r\n\t\tassertNotNull(serviceResponse);\r\n\t\tassertNotNull(serviceResponse.getEmployeeInfo());\r\n\t\tassertEquals(1, serviceResponse.getEmployeeInfo().size());\r\n\t}\r\n\r\n}\r\n<\/pre>\n<h4>9.4.3 Run the Cucumber Tests<\/h4>\n<p>I will create <code>RunCukesTest<\/code> and annotate it with <code>@RunWith(Cucumber.class)<\/code>. Execute it with <code>C:\\gitworkspace\\jax-ws-tutorial\\soapClient&gt;mvn install -P cucumber<\/code>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>RunCukesTest.java<\/em><\/span><\/p>\n<pre class=\"brush:java\">package jcg.demo.servicetest;\r\n\r\nimport org.junit.runner.RunWith;\r\n\r\nimport cucumber.api.CucumberOptions;\r\nimport cucumber.api.junit.Cucumber;\r\n\r\n@RunWith(Cucumber.class)\r\n@CucumberOptions(tags = { \"@SMOKE\" }, features = \"src\/test\/resources\/features\", plugin = { \"html:target\/cucumber\" })\r\npublic class RunCukesTest {\r\n\r\n}\r\n<\/pre>\n<h4>9.4.4 Test Reports<\/h4>\n<p>Verify the cucumber reports.<\/p>\n<p><figure id=\"attachment_59815\" aria-describedby=\"caption-attachment-59815\" style=\"width: 550px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/09\/cucumber-report.jpg\"><img decoding=\"async\" class=\"wp-image-59815 size-full\" src=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/09\/cucumber-report.jpg\" alt=\"JAX-WS Tutorial - Cucumber Report\" width=\"550\" height=\"351\" srcset=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/09\/cucumber-report.jpg 550w, https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/09\/cucumber-report-300x191.jpg 300w\" sizes=\"(max-width: 550px) 100vw, 550px\" \/><\/a><figcaption id=\"caption-attachment-59815\" class=\"wp-caption-text\">Figure 2 Cucumber Report<\/figcaption><\/figure><\/p>\n<h2><a name=\"heading10\"><\/a>10. JAX-WS Tutorial &#8211; Summary<\/h2>\n<p>In\u00a0this article, I demonstrated how to create and consume web services using JAX-WS in a Maven project with both Top-down and Bottom-up approaches. Top-down approach is the preferred way, but developers usually use a Bottom-up approach to generate WSDL and revise it. Once the WSDL is finalized, developers complete it with a Top-down approach.<br \/>\n&nbsp;<br \/>\nI also demonstrated how to deploy web services with a JAX-WS Endpoint as a standard Java application and deploy it in a Tomcat container. I also showed how to test the web services via SoapUI, Junit, and cucumber framework.<br \/>\n&nbsp;<br \/>\nYou may secure the web service. Click <a href=\"https:\/\/examples.javacodegeeks.com\/enterprise-java\/jws\/jax-ws-bindingprovider-example\/\" target=\"_blank\" rel=\"noopener\">here<\/a> for how to secure the web service with JAX-WS.<\/p>\n<h2><a name=\"heading11\"><\/a>11. Download the Source Code<\/h2>\n<p>This tutorial consists of a Maven project to create, consume, and test the JAX-WS web services.<\/p>\n<div class=\"download\"><strong>Download<\/strong><br \/>\nYou can download the full source code of this example here: <a href=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/09\/jax-ws-tutorial.zip\"><strong>JAX-WS Tutorial for Beginners<\/strong><\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Java API for XML Web Services (JAX-WS) is a Java programming language for creating web services, particularly SOAP services. In this tutorial, we will build a multi-module Maven project to demonstrate how to create, deploy, consume, and test JAX-WS web services. Table Of Contents 1. Introduction 2. A Brief History of Web Services 3. Technologies &hellip;<\/p>\n","protected":false},"author":140,"featured_media":1240,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[461],"tags":[],"class_list":["post-59543","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jws"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JAX-WS Tutorial for Beginners - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Interested to learn more about JAX-WS? Then check out our detailed JAX-WS Tutorial! JAX-WS is a Java programming language for creating web services, particularly SOAP services.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JAX-WS Tutorial for Beginners - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Interested to learn more about JAX-WS? Then check out our detailed JAX-WS Tutorial! JAX-WS is a Java programming language for creating web services, particularly SOAP services.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/\" \/>\n<meta property=\"og:site_name\" content=\"Examples Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2018-09-03T08:00:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Mary Zheng\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mary Zheng\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/\"},\"author\":{\"name\":\"Mary Zheng\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/8a2034fbabcb20a9396e9819261855ae\"},\"headline\":\"JAX-WS Tutorial for Beginners\",\"datePublished\":\"2018-09-03T08:00:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/\"},\"wordCount\":1450,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/enterprise-java-logo.jpg\",\"articleSection\":[\"jws\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/\",\"name\":\"JAX-WS Tutorial for Beginners - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/enterprise-java-logo.jpg\",\"datePublished\":\"2018-09-03T08:00:37+00:00\",\"description\":\"Interested to learn more about JAX-WS? Then check out our detailed JAX-WS Tutorial! JAX-WS is a Java programming language for creating web services, particularly SOAP services.\",\"breadcrumb\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#primaryimage\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/examples.javacodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java Development\",\"item\":\"https:\/\/examples.javacodegeeks.com\/category\/java-development\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\/\/examples.javacodegeeks.com\/category\/java-development\/enterprise-java\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"jws\",\"item\":\"https:\/\/examples.javacodegeeks.com\/category\/java-development\/enterprise-java\/jws\/\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"JAX-WS Tutorial for Beginners\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#website\",\"url\":\"https:\/\/examples.javacodegeeks.com\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Examples and Code Snippets\",\"publisher\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/examples.javacodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/examples.javacodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/javacodegeeks\",\"https:\/\/x.com\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/8a2034fbabcb20a9396e9819261855ae\",\"name\":\"Mary Zheng\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2017\/11\/Mary-Zheng_avatar_1510732235-96x96.jpg\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2017\/11\/Mary-Zheng_avatar_1510732235-96x96.jpg\",\"caption\":\"Mary Zheng\"},\"description\":\"Mary has graduated from Mechanical Engineering department at ShangHai JiaoTong University. She also holds a Master degree in Computer Science from Webster University. During her studies she has been involved with a large number of projects ranging from programming and software engineering. She works as a senior Software Engineer in the telecommunications sector where she acts as a leader and works with others to design, implement, and monitor the software solution.\",\"url\":\"https:\/\/examples.javacodegeeks.com\/author\/mary-zheng\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"JAX-WS Tutorial for Beginners - Java Code Geeks","description":"Interested to learn more about JAX-WS? Then check out our detailed JAX-WS Tutorial! JAX-WS is a Java programming language for creating web services, particularly SOAP services.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/","og_locale":"en_US","og_type":"article","og_title":"JAX-WS Tutorial for Beginners - Java Code Geeks","og_description":"Interested to learn more about JAX-WS? Then check out our detailed JAX-WS Tutorial! JAX-WS is a Java programming language for creating web services, particularly SOAP services.","og_url":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/","og_site_name":"Examples Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2018-09-03T08:00:37+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Mary Zheng","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Mary Zheng","Est. reading time":"25 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#article","isPartOf":{"@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/"},"author":{"name":"Mary Zheng","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/8a2034fbabcb20a9396e9819261855ae"},"headline":"JAX-WS Tutorial for Beginners","datePublished":"2018-09-03T08:00:37+00:00","mainEntityOfPage":{"@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/"},"wordCount":1450,"commentCount":1,"publisher":{"@id":"https:\/\/examples.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#primaryimage"},"thumbnailUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/enterprise-java-logo.jpg","articleSection":["jws"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/","url":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/","name":"JAX-WS Tutorial for Beginners - Java Code Geeks","isPartOf":{"@id":"https:\/\/examples.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#primaryimage"},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#primaryimage"},"thumbnailUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/enterprise-java-logo.jpg","datePublished":"2018-09-03T08:00:37+00:00","description":"Interested to learn more about JAX-WS? Then check out our detailed JAX-WS Tutorial! JAX-WS is a Java programming language for creating web services, particularly SOAP services.","breadcrumb":{"@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#primaryimage","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/enterprise-java-logo.jpg","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/enterprise-java-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/jws\/jax-ws-tutorial-beginners\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/examples.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java Development","item":"https:\/\/examples.javacodegeeks.com\/category\/java-development\/"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/examples.javacodegeeks.com\/category\/java-development\/enterprise-java\/"},{"@type":"ListItem","position":4,"name":"jws","item":"https:\/\/examples.javacodegeeks.com\/category\/java-development\/enterprise-java\/jws\/"},{"@type":"ListItem","position":5,"name":"JAX-WS Tutorial for Beginners"}]},{"@type":"WebSite","@id":"https:\/\/examples.javacodegeeks.com\/#website","url":"https:\/\/examples.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Examples and Code Snippets","publisher":{"@id":"https:\/\/examples.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/examples.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/examples.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/examples.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/8a2034fbabcb20a9396e9819261855ae","name":"Mary Zheng","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2017\/11\/Mary-Zheng_avatar_1510732235-96x96.jpg","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2017\/11\/Mary-Zheng_avatar_1510732235-96x96.jpg","caption":"Mary Zheng"},"description":"Mary has graduated from Mechanical Engineering department at ShangHai JiaoTong University. She also holds a Master degree in Computer Science from Webster University. During her studies she has been involved with a large number of projects ranging from programming and software engineering. She works as a senior Software Engineer in the telecommunications sector where she acts as a leader and works with others to design, implement, and monitor the software solution.","url":"https:\/\/examples.javacodegeeks.com\/author\/mary-zheng\/"}]}},"_links":{"self":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/59543","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/users\/140"}],"replies":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=59543"}],"version-history":[{"count":0,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/59543\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/media\/1240"}],"wp:attachment":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=59543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=59543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=59543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}