apache cxf 下載地址:http://people.apache.org/dist/incubator/cxf/2.0.4-incubator/apache-cxf-2.0.4-incubator.zip
在spring context配置文件中引入以下cxf配置
<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" />
在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>
2.開發服務端WebService接口:
/**
* WebService接口定義類.
*
* 使用@WebService將接口中的所有方法輸出爲Web Service.
* 可用annotation對設置方法、參數和返回值在WSDL中的定義.
*/
@WebService
public interface WebServiceSample {
/**
* 一個簡單的方法,返回一個字符串
* @param hello
* @return
*/
String say(String hello);
/**
* 稍微複雜一些的方法,傳遞一個對象給服務端處理
* @param user
* @return
*/
String sayUserName(
@WebParam(name = "user")
UserDTO user);
/**
* 最複雜的方法,返回一個List封裝的對象集合
* @return
*/
public
@WebResult(partName="o")
ListObject findUsers();
}
由簡單到複雜定義了三個接口,模擬業務需求;
3.實現接口
/**
* WebService實現類.
*
* 使用@WebService指向Interface定義類即可.
*/
@WebService(endpointInterface = "cn.org.coral.biz.examples.webservice.WebServiceSample")
public class WebServiceSampleImpl implements WebServiceSample {
public String sayUserName(UserDTO user) {
return "hello "+user.getName();
}
public String say(String hello) {
return "hello "+hello;
}
public ListObject findUsers() {
ArrayList<Object> list = new ArrayList<Object>();
list.add(instancUser(1,"lib"));
list.add(instancUser(2,"mld"));
list.add(instancUser(3,"lq"));
list.add(instancUser(4,"gj"));
ListObject o = new ListObject();
o.setList(list);
return o;
}
private UserDTO instancUser(Integer id,String name){
UserDTO user = new UserDTO();
user.setId(id);
user.setName(name);
return user;
}
}
4.依賴的兩個類:用戶對象與List對象
/**
* Web Service傳輸User信息的DTO.
*
* 分離entity類與web service接口間的耦合,隔絕entity類的修改對接口的影響.
* 使用JAXB 2.0的annotation標註JAVA-XML映射,儘量使用默認約定.
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "User")
public class UserDTO {
protected Integer id;
protected String name;
public Integer getId() {
return id;
}
public void setId(Integer value) {
id = value;
}
public String getName() {
return name;
}
public void setName(String value) {
name = value;
}
}
關於List對象,參照了有關JWS的一個問題中的描述:DK6.0 自帶的WebService中 WebMethod的參數好像不能是ArrayList 或者其他List
傳遞List需要將List 包裝在其他對象內部才行 (個人理解 如有不對請指出) ,我在實踐中也遇到了此類問題.通過以下封裝的對象即可以傳遞List對象.
/**
* <p>Java class for listObject complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="listObject">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="list" type="{http://www.w3.org/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "listObject", propOrder = { "list" })
public class ListObject {
@XmlElement(nillable = true)
protected List<Object> list;
/**
* Gets the value of the list property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the list property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getList().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Object }
*
*
*/
public List<Object> getList() {
if (list == null) {
list = new ArrayList<Object>();
}
return this.list;
}
public void setList(ArrayList<Object> list) {
this.list = list;
}
}
5.WebService 服務端 spring 配置文件 ws-context.xml
<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://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName" default-lazy-init="true"> <jaxws:endpoint id="webServiceSample" address="/WebServiceSample" implementor="cn.org.coral.biz.examples.webservice.WebServiceSampleImpl"/> </beans>
WebService 客戶端 spring 配置文件 wsclient-context.xml
<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://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName" default-lazy-init="true"> <!-- ws client --> <bean id="identityValidateServiceClient" class="cn.org.coral.admin.service.IdentityValidateService" factory-bean="identityValidateServiceClientFactory" factory-method="create" /> <bean id="identityValidateServiceClientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <property name="serviceClass" value="cn.org.coral.admin.service.IdentityValidateService" /> <property name="address" value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/> </bean> </beans>
6.發佈到tomcat服務器以後通過以下地址即可查看自定義的webservice接口生成的wsdl:
http://88.148.29.54:8080/aio/services/WebServiceSample?wsdl
7.調用WebService接口的Junit單元測試程序
package test.coral.sample;
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import cn.org.coral.biz.examples.webservice.WebServiceSample;
import cn.org.coral.biz.examples.webservice.dto.UserDTO;
public class TestWebServiceSample extends
AbstractDependencyInjectionSpringContextTests {
WebServiceSample webServiceSampleClient;
public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {
this.webServiceSampleClient = webServiceSampleClient;
}
@Override
protected String[] getConfigLocations() {
setAutowireMode(AUTOWIRE_BY_NAME);
//spring 客戶端配置文件保存位置
return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };
}
public void testWSClinet(){
Assert.hasText(webServiceSampleClient.say(" world"));
}
}