Spring+cxf发布webservice服务--注解方式

来源:互联网 发布:小猪cms 视频展示 编辑:程序博客网 时间:2024/05/22 05:23

最近公司用到了webservice技术,自己还是两年前写过一个webservice接口,所以现在也忘了怎么写了,在网站找了一点资料:

Apache CXF 提供方便的 Spring 整合方法,可以通过注解、 Spring 标签式配置来暴露 Web Services 和消费 Web Services 
各种类型的Annotation 。 @WebService 和 @WebMethod 是 WSDL 映射 Annatotion 。这些 Annotation 将描述 Web Service 的 WSDL 文档元素和 Java 源代码联系在一起。 @SOAPBinding 是一个绑定的 annotation 用来说明网络协议和格式。 

1、 @WebService annotation 的元素 name,serviceName 和 targetNamespace 成员用来描述 
   wsdl:portType, wsdl:service ,和 targetNameSpace 生成 WebService 中的 WSDL 文件。 
2、 @SOAPBinding 是一个用来描述 SOAP 格式和 RPC 的协议的绑定 Annotation 。 
3、 @WebMethod Annotation 的 operationName 成员描述了 wsdl:operation ,而且它的操作描  
   述了WSDL 文档中的 SOAPAction 头部。这是客户端必须要放入到 SQAPHeader 中的数 
   值,SOAP 1.1 中的一种约束。 
4、 @WebParam Annotation 的 partName 成员描述了 WSDL 文档中的 wsdl:part 。 
5、 @WebResult Annotation 的 partName 成员描述了 wsdl:part 用来返回 WSDL 文档的值。 

例如下面使用annotation 定义了一个 webservice : 
import  java.util.List; 
import  javax.jws.WebMethod; 
import  javax.jws.WebParam; 
import  javax.jws.WebResult; 
import  javax.jws.WebService; 
import  com.cxf.pojo.User; 

@WebService (targetNamespace =  "http://jdk.study.hermit.org/client" ) 
public   interface  UserService { 
@WebMethod (operationName= "Insert" ) 
public   void  insert(  @WebParam (name =  "userId" ) String userid, 
    @WebParam (name =  "userName" ) String username, 
    @WebParam (name =  "userEmail" ) String useremail, 
    @WebParam (name =  "userAge" )  int  userage); 
@WebMethod (operationName= "GetUserById" ) 
@WebResult (name =  "result" ) 
public  User getUserById( @WebParam (name= "userid" ) String userid); 
@WebMethod (operationName= "GetAllUsers" ) 
@WebResult (name =  "result" ) 
public  List getAllUsers(); 




其实现类如下所示: 
import  java.util.List; 
import  javax.jws.WebService; 

import  com.cxf.dao.UserDao; 
import  com.cxf.pojo.User; 
import  com.cxf.service.UserService; 

@WebService (endpointInterface= "com.cxf.service.UserService" ) 
public   class  UserServiceImpl  implements  UserService { 

private  UserDao  userDao ; 
public  List getAllUsers() { 
return   userDao .findAllUser(); 


public   User  getUserById(String userid) { 
return   userDao .findUserById(userid); 


public   void  insert(String userid, String username, String useremail,  int  userage) { 
User user= new  User(); 
user.setUserage(userage); 
user.setUseremail(useremail); 
user.setUserid(userid); 
user.setUsername(username); 
userDao .insert(user); 
System. out .println( "insert successfully!" ); 


public   void  setUserDao(UserDao userDao) { 
this . userDao  = userDao; 


注意:实现类中的@WebService ,其中的 endpointInterface 成员指定了该类实现的接口 

在Spring 的配置文件中,需要对其进行配置: 
首先在ApplicationContext.xml(Spring 的配置文件 ) 中引入 CXF 的 XML Scheam  配置文件 ), 如下 : 
< beans  xmlns = "http://www.springframework.org/schema/beans" 
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
xmlns:jaxws="http://cxf.apache.org/jaxws" 
xsi:schemaLocation = "http://www.springframework.org/schema/beans   
     http://www.springframework.org/schema/beans/spring-beans.xsd 
http://cxf.apache.org/jaxws     http://cxf.apache.org/schemas/jaxws.xsd "> 
<! — 还需要引入以下3 个关于 CXF 的资源文件,这三个文件在 cxf.jar 中 --> 
< import  resource = "classpath:META-INF/cxf/cxf.xml"  /> 
< import  resource = "classpath:META-INF/cxf/cxf-extension-soap.xml" /> 
< import  resource = "classpath:META-INF/cxf/cxf-servlet.xml"  /> 
…… …… …… …… …… …… …… …… …… …… 
</bean> 

其次就是在 Spring的配置文件中配置 webservice ,如下所示: 
< jaxws:endpoint  id = "userManager"  address = "/UserManager" 
         implementorClass = "com.cxf.service.UserService" > 
         < jaxws:implementor > 
             < bean  id = "userServiceImpl" 
                 class = "com.cxf.service.impl.UserServiceImpl" > 
                 < property  name = "userDao" > 
                     < ref  bean = "userDao"  /> 
                 </ property > 
             </ bean > 
         </ jaxws:implementor > 
  </ jaxws:endpoint > 

注意: 
①、 address   为webservice 发布的地址 
②、 implementorClass   为该webservice 实现的接口 
③、 < jaxws:implementor ></ jaxws:implementor > 之间定义的是 implementorClass 指定接口的实现类 

另外,在Spring 的配置文件中配置完成后,需要修改 web.xml 文件 
< servlet > 
< servlet-name > CXFServlet </ servlet-name > 
< servlet-class > 
org.apache.cxf.transport.servlet.CXFServlet 
</ servlet-class > 
</ servlet > 
< servlet-mapping > 
< servlet-name > CXFServlet </ servlet-name > 
< url-pattern > /services/* </ url-pattern > 
</ servlet-mapping > 
注意<url-pattern>/   services /*</url-pattern>配置, CXFServlet 会拦截此类 url ,进行处理 。上面配置的webservice 将通过如下 URL 访问到: 
http://localhost:8080/cxf-ws/services/   UserManager 
UserManager 为 < jaxws:endpoint  > 标签中address 属性对应的值 
cxf-ws 为本项目的名称 

配置完成之后,将项目部署到tomcat 上 
输入URL : http://localhost:8080/cxf-ws/services/   UserManager ?wsdl 
将会看到生成的wsdl 文件 

为了能够直接访问到 com.cxf.service.UserService 中的 insert 方法,进行如下测试: 
创建一个insertUser.html 页面: 
< html > 
< head > 
< script  type = "text/javascript" > 
function  post()  { 
var  xmlhttp= false ; 
if  (!xmlhttp &&  typeof  XMLHttpRequest!= 'undefined' )  { 
try { 
xmlhttp =  new  XMLHttpRequest(); 
} catch  (e)  { 
xmlhttp= false ; 


if  (!xmlhttp && window.createRequest)  { 
try { 
xmlhttp = window.createRequest(); 
} catch  (e)  { 
xmlhttp= false ; 


var  dest = document.getElementById( 'destination' ).value; 
xmlhttp.open( "POST" , dest,  true ); 
xmlhttp.onreadystatechange= function ()  { 
    if  (xmlhttp.readyState==4)  { 
     document.getElementById( "result" ).innerHTML = xmlhttp.responseText; 
     } 

xmlhttp.setRequestHeader( "Man" ,  "POST "  + dest +  " HTTP/1.1" ) 
xmlhttp.setRequestHeader( "MessageType" ,  "CALL" ) 
xmlhttp.setRequestHeader( "Content-Type" ,  "text/xml" ); 
var  texta = document.getElementById( 'texta' ); 
var  soapmess = texta.value; 
xmlhttp.send(soapmess); 

</ script > 
</ head > 
< body > 
hi there 
< form  id = "forma" > 
< textarea  id = "texta"   rows = "10"  cols = "80" > 
<?xml version='1.0' encoding='UTF-8'?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body> 
< I nsert> 
  <userId>2005221104210066</userId> 
  <userName>Leon Cao</userName> 
  <userEmail>caohongliang2@163.com</userEmail> 
  <userAge>23</userAge> 
</ I nsert> 
  </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
</ textarea > 
< p > 
< input  type = "text"  id = "destination"  size = "50"  value = " http://localhost:8080/cxf-ws/services/UserManager " ></ input > 
< p > 
< input  type = "button"  onclick = "post()"  name = "submit"  value = "Submit" ></ input > 
</ form > 
< div  id = "container" ></ div > 
Result: 
< hr > 
< div  id = "result" > 
</ div > 
< hr > 
< div  id = "soap" > 
</ div > 
</ body > 
</ html > 
在该测试页面需要注意标记为红色的部分,如下是一个soap message : 
<?xml version='1.0' encoding='UTF-8'?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body> 
< I nsert> 
  <userId>2005221104210066</userId> 
  <userName>Leon Cao</userName> 
  <userEmail>caohongliang2@163.com</userEmail> 
  <userAge>23</userAge> 
</ I nsert> 
  </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
注意: 
① <SOAP-ENV:Body > 标签之间 < I nsert> 对应 @WebMethod (operationName= "Insert" ) 
  中的operationName 属性的值 
② <userId> 、 <userName> 、 <userEmail> 、 <userAge> 标签对各自对应着insert 方法中  
  @WebParam 中name 属性的值: 
@WebParam (name =  "userId" ) String userid, 
@WebParam (name =  "userName" ) String username, 
@WebParam (name =  "userEmail" ) String useremail, 
@WebParam (name =  "userAge" )  int  userage); 
当向webservice 上发送该 soap 消息的时候将自动解析该 soap 消息,将 Insert 解析为 insert 方法,将 <userId> 、 <userName> 、 <userEmail> 、 <userAge> 标签对之间的值解析为相对应的参数 userid 、 username 、 useremail 、 userage 
③ < input  type = "text"  id = "destination"  size = "50"  value = " http://localhost:8080/cxf-ws/services/UserManager " ></ input > 
该文本标签中的value 属性为 webservice 的地址 

运行该页面,点击Submit 后将在数据库中插入一行数据,即调用了 inser 方法成功

原创粉丝点击