@ruoli
2016-10-14T10:21:59.000000Z
字数 4618
阅读 3477
Java基础
JAX-WS(Java API for XML Web Services)规范是SUN公司提供的一套实现Webservice远程交互的技术,是JDK1.6+原生支持的轻量级实现。
工程必须依赖JDK1.6+
此处工程名为:Ws-Sever
不需依赖其它外部Jar
package server;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class DemoService{
@WebMethod
public String sayHello(@WebParam(name="name") String name) {
return "hello,"+name;
}
@WebMethod
public int plus(@WebParam(name="x") int x, @WebParam(name="y") int y) {
return x + y;
}
}
package server;
import javax.xml.ws.Endpoint;
public class WsServer {
/**
* @param args
*/
public static void main(String[] args) {
DemoService plus = new DemoService();
String addr = "http://127.0.0.1:8888/DemoService";
Endpoint.publish(addr, plus);
}
}
启动此main方法,在浏览器中访问:
http://127.0.0.1:8888/DemoService?wsdl
即可看到wsdl信息。
经过SoapUI测试,响应符合预期。
代码量较少,不提供示例工程。
Jax-ws 还提供了了更多注解用户方便开发,详细可自行查阅。
也可详细参考:
http://www.cnblogs.com/adolfmc/p/4383091.html
基于Spring IoC容器发布Web服务,能够大大降低WebService实现过程,也能够更好的与企业级应用进行整合,spring本身就提供了对JAX-WS的支持,以下介绍如何基于Spring和JAX-WS发布WebService。
此处命名为:Jaxws-Spring ,并在pom.xml中添加如下内容:
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
HelloWorld.Java
package jaxws;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
@WebMethod
public String sayHello(String name);
}
HelloWorldImpl.java
package jaxws;
import javax.jws.WebService;
import org.springframework.stereotype.Component;
@Component
@WebService(serviceName = "HelloWorldService", endpointInterface = "jaxws.HelloWorld")
public class HelloWorldImpl implements HelloWorld{
public String sayHello(String name) {
return "Hello," + name;
}
}
需要注意的是:在实现类中添加了注解@Component,该注解用于Spring查找组件。
在web.xml文件中添加spring的监听器配置信息,如下:
<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:jaxws-beans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
在项目构建根路径classpath下新增配置文件jaxws-beans.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="jaxws"></context:component-scan>
<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
<property name="baseAddress" value="http://localhost:8089/services/"/>
</bean>
</beans>
注意:context:component-scan标签指定了查找组件的包名,SimpleJaxWsServiceExporter类的baseAddress属性用于指定webservice的根路径,完整的web服务地址=根路径+WebService名称。
访问地址为:http://localhost:8089/services/HelloWorldService?wsdl
即可看见wsdl信息。
访问密码:6m5l
Handler和Servlet中的filter极为相似,我们可以对所有WebServicer进行拦截,在这个Handler中我们可以记录日志、权限控制、对请求的SOAP消息进行加密,解密等。
具体实现方式如下:
此处新建AuthValidationHandler.java,示例如下:
package server;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class AuthValidationHandler implements SOAPHandler<SOAPMessageContext> {
public Set<QName> getHeaders() {
return null;
}
public void close(MessageContext context) {
// 每次webService请求调用结束时会调用,通常会做释放资源的操作
}
public boolean handleFault(SOAPMessageContext context) {
// 每当handlerMessage发生异常时,会调用
return false;
}
public boolean handleMessage(SOAPMessageContext context) {
try{
//更改返回报文的输出头前缀
SOAPMessage soapMessage = context.getMessage();
SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
soapEnvelope.setPrefix("soapenv");
soapEnvelope.getBody().setPrefix("soapenv");
soapEnvelope.getBody().getFirstChild().setPrefix("soa");
}catch(Exception exception){
exception.printStackTrace();
}
return true;
}
}