加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单

发布时间:2020-12-16 23:42:09 所属栏目:安全 来源:网络整理
导读:现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了这样的业务要求,需要在.net开发的客户端系统中访问java开发的web系统,这样的业务需求自然需要通过WebService进行信息数据的操作。下面就将我们在开发中摸索的一点经验教训总结以下
现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了这样的业务要求,需要在.net开发的客户端系统中访问java开发的web系统,这样的业务需求自然需要通过WebService进行信息数据的操作。下面就将我们在开发中摸索的一点经验教训总结以下,以供大家参考.?

我们项目的整个架构使用的比较流行的WSH MVC组合,即webwork2 + Spring + Hibernate;?
1.首先集成Apacha CXF WebService 到 Spring 框架中;?
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://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"));

}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读