webwork2 + Spring + Hibernate;
1.首先集成Apacha CXFWebService 到 Spring 框架中;
apache cxf 下载地址:http://people.apache.org/dist/incubator/cxf/2.0.4-incubator/apache-cxf-2.0.4-incubator.zip
在spring context配置文件中引入以下cxf配置
<importresource="classpath*:META-INF/cxf/cxf.xml" />
<importresource="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将接口中的所有方法输出为WebService.
* 可用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(Integerid,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的一个问题中的描述:
/**
*<p>Java class for listObject complex type.
*
*<p>The following schema fragment specifies the expected content containedwithin this class.
*
*<pre>
*<complexType name="listObject">
* <complexContent>
* <restrictionbase="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <elementname="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 listproperty.
*
*<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
<beansxmlns="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/jaxwshttp://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:endpointid="webServiceSample"
address="/WebServiceSample"implementor="cn.org.coral.biz.examples.webservice.WebServiceSampleImpl"/>
</beans>
WebService 客户端 spring 配置文件wsclient-context.xml
<beansxmlns="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" />
<beanid="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;
importorg.springframework.test.AbstractDependencyInjectionSpringContextTests;
importcn.org.coral.biz.examples.webservice.WebServiceSample;
import cn.org.coral.biz.examples.webservice.dto.UserDTO;
public class TestWebServiceSample extends
AbstractDependencyInjectionSpringContextTests {
WebServiceSample webServiceSampleClient;
public voidsetWebServiceSampleClient(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"));
}
}