Tomcat服务器上的JAX-WS Web服务部署
我们学习了如何使用JAX-WS创建SOAP Web服务并使用javax.xml.ws.Endpoint
进行发布,但是大多数时候我们希望将服务部署在servlet容器上。
因此,今天我们将学习如何创建Web服务并将其部署在Apache Tomcat服务器上,然后使用客户端应用程序对其进行测试。
为此,我们的第一步是创建一个动态Web项目来编写我们的业务逻辑。
我们的最终项目将如下图所示。
为了在servlet容器上部署JAX-WS Web服务,我们需要向其中添加一些jar文件。
有两种方法可以做到这一点。
从https://jax-ws.java.net/下载jar文件,并将其包含在动态Web项目中。
将Dynamic Web项目转换为Maven并添加以下依赖项。
这将自动下载所有必需的jar文件作为maven依赖关系,如下图所示。
我喜欢这种方法,因为我可以轻松升级版本,并且还可以确保不会丢失任何jar。
现在,我们来看一下业务逻辑。
首先,我们将创建一个模型bean类。
<dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>2.2.10</version> </dependency>
现在,我们将创建我们的服务接口和实现类。
package com.theitroad.jaxws.beans; import java.io.Serializable; public class Person implements Serializable{ private static final long serialVersionUID = -5577579081118070434L; private String name; private int age; private int id; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } @Override public String toString(){ return id+"::"+name+"::"+age; } }
package com.theitroad.jaxws.service; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import com.theitroad.jaxws.beans.Person; @WebService @SOAPBinding(style = SOAPBinding.Style.RPC) public interface PersonService { @WebMethod public boolean addPerson(Person p); @WebMethod public boolean deletePerson(int id); @WebMethod public Person getPerson(int id); @WebMethod public Person[] getAllPersons(); }
我们的Web服务代码已准备就绪,需要执行下一步以将其创建为可在Servlet容器中部署的Web存档。
package com.theitroad.jaxws.service; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.jws.WebService; import com.theitroad.jaxws.beans.Person; @WebService(endpointInterface = "com.theitroad.jaxws.service.PersonService") public class PersonServiceImpl implements PersonService { private static Map<Integer,Person> persons = new HashMap<Integer,Person>(); @Override public boolean addPerson(Person p) { if(persons.get(p.getId()) != null) return false; persons.put(p.getId(), p); return true; } @Override public boolean deletePerson(int id) { if(persons.get(id) == null) return false; persons.remove(id); return true; } @Override public Person getPerson(int id) { return persons.get(id); } @Override public Person[] getAllPersons() { Set<Integer> ids = persons.keySet(); Person[] p = new Person[ids.size()]; int i=0; for(Integer id : ids){ p[i] = persons.get(id); i++; } return p; } }
没有特定于项目的内容,这些是对Web服务添加侦听器类和前端servlet类的通用更改。
下一步是在WEB-INF目录中创建sun-jaxws.xml
文件,我们将其中提供端点详细信息。
URL模式应与web.xml文件中定义的相同。
sun-jaxws.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>JAXWS-Tomcat</display-name> <listener> <listener-class> com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <servlet> <servlet-name>JAXWSServlet</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JAXWSServlet</servlet-name> <url-pattern>/personWS</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> </web-app>
就是这样,我们完成了。
只需将项目导出为WAR文件并将其部署到tomcat容器中即可。
如下图所示访问Web服务URL。
访问WSDL URL,并记下targetNamespace和name属性,我们将在客户端程序中使用它们。
以下是使用我们的Web服务并运行一些测试的简单测试程序。
<?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns="https://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <endpoint name="PersonServiceImpl" implementation="com.theitroad.jaxws.service.PersonServiceImpl" url-pattern="/personWS" </endpoints>
如前面的教程中所述,我们可以使用wsimport实用程序生成并使用客户端存根。