Tomcat服务器上的JAX-WS Web服务部署

时间:2020-02-23 14:35:17  来源:igfitidea点击:

我们学习了如何使用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实用程序生成并使用客户端存根。