您可能知道,我们可以使用四种主要的Web服务样式。 它们如下:
- 文件/文学
- 包装的文件/文学
- RPC /编码
- RPC /文字
当然,现在不建议使用RPC /编码样式。 如果您有兴趣,可以在此处找到这篇非常全面的文章,以了解不同的Web服务样式及其优点。
今天,我们将看到如何编写一种Web服务的Document / Literal包装器。 该职位的议程如下:
- 根据包装的文档/文字编写一个简单的Web服务
- 如何在tomcat Web容器上托管简单的Web服务
- 一个简单的测试客户即可测试我们的服务
因此,让我们开始旅程:
- 根据包装的文档/文字编写一个简单的Web服务
package com.wsbindings;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;
@WebService
@SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL, parameterStyle = ParameterStyle.WRAPPED)
public interface AddService {
@WebMethod
public int addIntegers(@WebParam(name = "intOne") int paramOne,
@WebParam(name = "intTwo") int paramTwo);
}
这是我们的基本Web服务。 这是我们服务的基本接口。 如您所见,我们首先使用@ javax.jws.WebService对其进行注释,以指示其将要编写的Web服务。 接下来是我们定义SOAPBinding的有趣部分。 在这里,我们声明要编写一个DOCUMENT样式的Web服务,该服务是LITERAL形式,也是WRAPPED样式。 这里要注意的一件事是,Soap Binding批注中指定的所有三个属性值都是默认值,因此您可以不必在此处明确声明而无需使用它们。 我这样做是为了使本文清晰。
继续,让我们看看该特定接口的实现如何:
package com.wsbindings;
import javax.jws.WebService;
@WebService(endpointInterface="com.wsbindings.AddService")
public class AddServiceImpl implements AddService{
public int addIntegers(int paramOne, int paramTwo) {
return paramOne+paramTwo;
}
}
在此服务的功能方面,这里同样没有什么壮观的。 只需将传入的两个数字相加,然后发回相加结果。 请注意,在这里我们再次必须使用@WebService批注对实现类进行批注。 现在,我们已经完成了编写Web服务合同和实现的初始部分,让我们看看如何将其托管在tomcat Web容器上。
- 如何在tomcat Web容器上托管简单的Web服务
如您所知,默认情况下,tomcat不带有JAX-WS实现,这与典型的应用程序服务器(例如JBoss,Glassfish)不同。 因此,要使其正常工作,您需要获得JAX-WS规范的实现。 在这种情况下,我们将使用Metro 。 您可以将jar文件从下载文件复制到WEB-INF / lib目录,也可以使用Maven为您完成,这就是我将在本文中做的。 因此,为了获得与Metro实施相关的require jar文件,我将以下依赖项添加到pom中:
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.1.3</version>
<exclusions>
<exclusion>
<groupId>com.sun.xml.stream</groupId>
<artifactId>sjsxp</artifactId>
</exclusion>
</exclusions>
</dependency>
请注意,我在这里为sjsxp工件添加了一个排除项,因为我需要的是比从传递依赖中绘制的版本更高的版本。 否则,您将获得以下异常。
无法初始化类javax.xml.stream.XMLStreamException:编码UTF-8的底层流和writeStartDocument()方法utf-8的输入参数不匹配。
为了解决此问题,我需要在pom中添加以下依赖项:
<dependency>
<groupId>com.sun.xml.stream</groupId>
<artifactId>sjsxp</artifactId>
<version>1.0.1</version>
</dependency>
多亏了这个线程,我才能够找到这个解决方案。
继续,我们需要定义一个特定的xml文件,该文件应放在名为sun-jaxws.xml的WEB-INF目录下 。 该XML指定了我们如何访问Web服务以及在何处找到实现类。 让我们看一下该文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
<endpoint
name="AddWS"
implementation="com.wsbindings.AddServiceImpl"
url-pattern="/addws"/>
</endpoints>
在这里,我们提供了Web服务实现类所驻留的包以及有关如何访问特定Web服务的URL模式。 我们要做的最后一件事是将以下内容添加到我们的web.xml中,以便成功托管我们的Web服务:
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>AddWS</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddWS</servlet-name>
<url-pattern>/addws</url-pattern>
</servlet-mapping>
注意,我们必须定义一个上下文侦听器和一个Servlet类,它们将处理我们的Web服务调用。 如果查看WSServletContextListner的源代码,将看到它从WEB-INF目录读取sun-jaxws.xml文件,并相应地为Web服务上下文创建类加载器。 关于文档样式Web服务的一件事是,您需要为请求和响应生成一些代码。 如果不这样做,则会出现以下错误,并显示以下消息:
您是否运行过APT来生成它们?
您可以使用JDK安装附带的wsgen工具生成所需的类。 您还可以使用Apache-CXF为您生成这些类。 我们将通过提供给我们的apache-cxf maven插件来使用后一种方法。 将以下内容包括到您的pom和您的物品中;
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.0.9</version>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>generate-wsdl</id>
<phase>process-classes</phase>
<configuration>
<className>com.wsbindings.AddServiceImpl</className>
<argline>-classdir ${project.build.directory}/classes</argline>
</configuration>
<goals>
<goal>java2wsdl</goal>
</goals>
</execution>
</executions>
</plugin>
在这里,我们使用java2wsdl命令为我们的Web服务生成所需的请求和响应对象。 如您所见,我已经使用<argline>属性指定我希望生成的类进入的位置。 由于在构建war文件时运行的常规maven编译任务将在classes目录中查找,因此我也将我们的类指定为包含在同一路径中,以便在war时将它们与我们的Web服务类捆绑在一起被建造。 通过查看此处指定的参数,您可以看到所有可能发出的命令。
当我包含我的apache-cxf maven插件时,我的pom指示错误,如下所示:
生命周期配置未涵盖插件执行
经过对该问题的研究后,我偶然发现了此处所述的解决方案。因此,要解决此问题,您必须在pom的<build>标记下包含以下代码段:
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings
only. It has no influence on the Maven build itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.0.9</version>
<goals>
<goal>test-compile</goal>
<goal>compile</goal>
</goals>
</pluginExecutionFilter>
<action>
<execute />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
那应该为您摆脱那个错误,尽管我不能给您确切的原因来说明为什么出现该警告。 如果您知道确切的原因,请您为我们大家的利益发表评论。 之后,您只需生成war文件并将其复制到tomcat的webapps目录即可。 然后,您将可以通过以下路径访问Web服务:
http:// localhost:8080 / ws-bindings / addws
我将tomcat托管在其上的端口是8080,而ws-bindings是我的war文件的名称。
最后,让我们看看如何生成服务所需的客户端存根,然后编写一个小型客户端来测试我们的Web服务。
- 一个简单的测试客户即可测试我们的服务
我们将再次使用apache-cxf maven插件通过wsdl2java命令生成客户端存根。 请注意,首先我们需要从托管我们的Web服务的路径获取wsdl。 它将位于;
http://localhost:8080/ws-bindings/addws?wsdl
然后,我将内容复制到单独的xml文件中,并将其保存在我创建的用于生成客户端存根的单独的maven项目的资源目录下。 然后,您需要做的就是添加生成pom中的存根所需的配置,如下所示;
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.0.9</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<wsdlOptions>
<wsdlOption>
<wsdl>${project.basedir}/src/main/resources/AddService.wsdl</wsdl>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
这将为您生成测试Web服务所需的存根。 最后,让我们编写一个客户端以使用生成的存根访问我们的Web服务。
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import com.wsbindings.AddService;
public class DocWrapperClient {
public static void main(String[] args) throws MalformedURLException {
URL wsdlLocation = new URL("http://localhost:8080/ws-bindings/addws?wsdl");
QName qName = new QName("http://wsbindings.com/", "AddServiceImplService");
Service service = null;
service = Service.create(wsdlLocation, qName);
AddService ser = service.getPort(AddService.class);
System.out.println(ser.addIntegers(1, 1));
}
}
就是这样,我希望您觉得内容有用。 您可以从此处下载与服务器相关的maven项目,并从此处下载客户端存根生成maven项目,以查看示例。
翻译自: https://www.javacodegeeks.com/2013/04/let-us-write-a-document-style-web-service.html