[关闭]
@ruoli 2016-10-14T10:21:59.000000Z 字数 4618 阅读 3477

使用Jax-ws搭建Webservice服务端

Java基础


JAX-WS(Java API for XML Web Services)规范是SUN公司提供的一套实现Webservice远程交互的技术,是JDK1.6+原生支持的轻量级实现。

1、快速简易搭建

1、新建Java工程

  工程必须依赖JDK1.6+
  此处工程名为:Ws-Sever
  不需依赖其它外部Jar

2、新建DemoService.java服务提供类

  1. package server;
  2. import javax.jws.WebMethod;
  3. import javax.jws.WebParam;
  4. import javax.jws.WebService;
  5. import javax.jws.soap.SOAPBinding;
  6. @WebService
  7. @SOAPBinding(style = SOAPBinding.Style.RPC)
  8. public class DemoService{
  9. @WebMethod
  10. public String sayHello(@WebParam(name="name") String name) {
  11. return "hello,"+name;
  12. }
  13. @WebMethod
  14. public int plus(@WebParam(name="x") int x, @WebParam(name="y") int y) {
  15. return x + y;
  16. }
  17. }

3、新建WsServer.java 控制类

  1. package server;
  2. import javax.xml.ws.Endpoint;
  3. public class WsServer {
  4. /**
  5. * @param args
  6. */
  7. public static void main(String[] args) {
  8. DemoService plus = new DemoService();
  9. String addr = "http://127.0.0.1:8888/DemoService";
  10. Endpoint.publish(addr, plus);
  11. }
  12. }

启动此main方法,在浏览器中访问:http://127.0.0.1:8888/DemoService?wsdl 即可看到wsdl信息。

经过SoapUI测试,响应符合预期。

代码量较少,不提供示例工程。

4、其它

Jax-ws 还提供了了更多注解用户方便开发,详细可自行查阅。
也可详细参考:
http://www.cnblogs.com/adolfmc/p/4383091.html

2、与Spring集成方案

基于Spring IoC容器发布Web服务,能够大大降低WebService实现过程,也能够更好的与企业级应用进行整合,spring本身就提供了对JAX-WS的支持,以下介绍如何基于Spring和JAX-WS发布WebService。

1、新建Maven Web工程

此处命名为:Jaxws-Spring ,并在pom.xml中添加如下内容:

  1. <dependency>
  2. <groupId>org.springframework.ws</groupId>
  3. <artifactId>spring-ws-core</artifactId>
  4. <version>2.1.4.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.jdom</groupId>
  8. <artifactId>jdom</artifactId>
  9. <version>1.1</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>jaxen</groupId>
  13. <artifactId>jaxen</artifactId>
  14. <version>1.1.6</version>
  15. </dependency>

2、新建Web服务接口和实现类

HelloWorld.Java

  1. package jaxws;
  2. import javax.jws.WebMethod;
  3. import javax.jws.WebService;
  4. @WebService
  5. public interface HelloWorld {
  6. @WebMethod
  7. public String sayHello(String name);
  8. }

HelloWorldImpl.java

  1. package jaxws;
  2. import javax.jws.WebService;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. @WebService(serviceName = "HelloWorldService", endpointInterface = "jaxws.HelloWorld")
  6. public class HelloWorldImpl implements HelloWorld{
  7. public String sayHello(String name) {
  8. return "Hello," + name;
  9. }
  10. }

需要注意的是:在实现类中添加了注解@Component,该注解用于Spring查找组件。

3、在web.xml文件中配置

在web.xml文件中添加spring的监听器配置信息,如下:

  1. <web-app>
  2. <context-param>
  3. <param-name>contextConfigLocation</param-name>
  4. <param-value>classpath:jaxws-beans.xml</param-value>
  5. </context-param>
  6. <listener>
  7. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  8. </listener>
  9. </web-app>

4、新增配置文件jaxws-beans.xml

在项目构建根路径classpath下新增配置文件jaxws-beans.xml,内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
  8. <context:component-scan base-package="jaxws"></context:component-scan>
  9. <bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
  10. <property name="baseAddress" value="http://localhost:8089/services/"/>
  11. </bean>
  12. </beans>

注意:context:component-scan标签指定了查找组件的包名,SimpleJaxWsServiceExporter类的baseAddress属性用于指定webservice的根路径,完整的web服务地址=根路径+WebService名称。

5、启动工程并访问

访问地址为:http://localhost:8089/services/HelloWorldService?wsdl 即可看见wsdl信息。

6、基础工程下载

点此下载工程

访问密码:6m5l

3、Jaxws-Handler的使用

Handler和Servlet中的filter极为相似,我们可以对所有WebServicer进行拦截,在这个Handler中我们可以记录日志、权限控制、对请求的SOAP消息进行加密,解密等。
具体实现方式如下:

1、新建处理类

此处新建AuthValidationHandler.java,示例如下:

  1. package server;
  2. import java.util.Set;
  3. import javax.xml.namespace.QName;
  4. import javax.xml.soap.SOAPEnvelope;
  5. import javax.xml.soap.SOAPMessage;
  6. import javax.xml.ws.handler.MessageContext;
  7. import javax.xml.ws.handler.soap.SOAPHandler;
  8. import javax.xml.ws.handler.soap.SOAPMessageContext;
  9. public class AuthValidationHandler implements SOAPHandler<SOAPMessageContext> {
  10. public Set<QName> getHeaders() {
  11. return null;
  12. }
  13. public void close(MessageContext context) {
  14. // 每次webService请求调用结束时会调用,通常会做释放资源的操作
  15. }
  16. public boolean handleFault(SOAPMessageContext context) {
  17. // 每当handlerMessage发生异常时,会调用
  18. return false;
  19. }
  20. public boolean handleMessage(SOAPMessageContext context) {
  21. try{
  22. //更改返回报文的输出头前缀
  23. SOAPMessage soapMessage = context.getMessage();
  24. SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
  25. soapEnvelope.setPrefix("soapenv");
  26. soapEnvelope.getBody().setPrefix("soapenv");
  27. soapEnvelope.getBody().getFirstChild().setPrefix("soa");
  28. }catch(Exception exception){
  29. exception.printStackTrace();
  30. }
  31. return true;
  32. }
  33. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注