分享
 
 
 

XFire 最新生火指南(下)

王朝other·作者佚名  2006-11-26
窄屏简体版  字體: |||超大  

作者:江南白衣

本文来自SpringSide WIki,请留意Wiki上的最新版本

请先阅读:XFire生火指南(上)

1. JSR181

JSR181式通过annotated POJO ,零配置文件的导出Web服务,是BEA倡导的,JavaEE5里的正规方式, XFire作了良好的支持。

但是,XFire关于JSR181方式的文档还不够清晰,请完整阅读本节以避免其中的数个陷阱。

1.1 参考文章

Spring, Hibernate and XFire

Webservices with Spring, XFire and jsr181

Basic Spring Web services with XFire and JSR 181

XFire JSR181参考文档

1.2 ApplicationContext.xml

因为配置都写在annotation,applicationContext.xml文件的内容比较固定。需要注意JSR181WebAnnotations与HandlerMapping不能lazy init.

<beans default-autowire="byName" default-lazy-init="true">

<!--引入XFire的预配置文件-->

<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>

<!-- 获得applicationContext中所有bean的JSR181 annotation -->

<bean id="webAnnotations" class="org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations" lazy-init="false"/>

<!-- 定义handler mapping,将所有JSR181定义的bean导出为web service -->

<bean id="jsr181HandlerMapping" class="org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping" lazy-init="false">

<property name="xfire" ref="xfire"/>

<property name="webAnnotations" ref="webAnnotations"/>

</bean>

</beans>

1.3 Interface+Impl模式

不同于XFire传统模式,窄接口不是必须的,只是考虑到client如果也使用XFire时,有个接口好生成Client而已。

如果采用Interface,Interface将担任主要的配置工作。

首先定义@WebService,可定义自己的NameSpace,如果不定义将采用NameSpace的默认生成算法。

接口中的函数将默认全部导出,不需要再用@WebMethod注释,可以如下例般进行更进一步配置:

@WebService(targetNamespace = "http://www.springside.org.cn")

public interface BookService {

@WebResult(name = "SearchResult")

List<Book> findBooksByCategory(@WebParam(name = "category", header = true)String cateoryId);

}

Manager不是纯粹的POJO,需要带上@WebService注释,指明InterFace。

@WebService(serviceName = "BookService",

endpointInterface = "org.springside.bookstore.components.xfire.server.jsr181.BookService")

public class BookManager implements BookService {...}

陷阱一:XFire JSR181参考文档

中在Interface中以@WebService(name="BookService")来定义ServiceName,这个做法看起来也比较合理,但实际上需要在Manager中以@WebService(serviceName ="BookService") 来定义,比较古怪。

1.4 纯POJO模式

参考文档中的例子,需要配置@WebMethod 指定需要导出的服务

@WebService(name = "EchoService", targetNamespace = "http://www.openuri.org/2004/04/HelloWorld")

public class Jsr181EchoService

{

@WebMethod(operationName = "echoString", action = "urn:EchoString")

@WebResult(name = "echoResult")

public String echo(@WebParam(name = "echoParam", header = true) String input)

{

return input;

}

}

1.5 Client注意事项

陷阱二:和传统模式的client有一点最大的区别,第3个参数需要是实际的Manager类,而不是接口类:

Service serviceModel = new AnnotationServiceFactory().create(BookManager.class);

2. Client

XFire的Client并不算强项,一共有三种模式:

2.1 Client开发者拥有Web服务端的class

Client与Server是同一个开发团队也好,Server端团队以jar形式提供开发包也好,反正如果能拿到服务端的接口Class和Entity类及aegis 配置文件的话。

传统模式:

Service serviceModel = new ObjectServiceFactory().create(BookService.class);

BookService service = (BookService) new XFireProxyFactory().create(serviceModel, serviceURL);

service.findBooksByCategory(cateoryId);

JSR181模式,注意这里Server端开发组需要向Client提供BookService的实现类BookManager,而不止于接口类,有点危险:

Service serviceModel = new AnnotationServiceFactory().create(BookManager.class);

BookService = (BookService) new XFireProxyFactory().create(serviceModel, serviceURL);

service.findBooksByCategory(cateoryId);

SpringSide 用泛型封装了一个XFireClientFactory,调用代码如下:

BookService service = XFireClientFactory.getClient(serviceURL, BookService.class);

BookService service = XFireClientFactory.getJSR181Client(serviceURL, BookService.class, BookManager.class);

2.2 动态模式

动态模式不需要服务端的class,不过性能和复杂对象映射等估计做得不会太好。

Client client = new Client(new URL("http://www.webservicex.net/CurrencyConvertor.asmx?WSDL"));

Object[] results = client.invoke("ConversionRate", new Object[] {"

BRL", "UGX"});

2.3 根据WSDL生成Client Stub

这才是Web Service Client的王道,可以访问任意编写下的Web Service,将在下一个版本中演示。

3. 测试

XFiire很重要的一个特性是提供了无须启动Web容器也能进行单元测试的能力。

原理就是利用XFire的JVM模式,以xfire.local://BookService channel而不是http://localhost/service/BookService

来访问服务。

测试的方式分两种:

一种是纯服务器角度,不编写客户端代码,以SOAP XML形式发送请求,返回的也是SOAP XML字串,直接对XML进行测试。

一种是编写2.1 中Client代码来进行测试。

前一种的测试的隔离度较高,而后一种比较简便。

3.1 测试基类

无论那种方式,都使用Xfire的AbstractXFireSpringTest基类,实现createContext()回调函数。

protected ApplicationContext createContext() {

return ClassPathXmlApplicationContext(new String[]{"classpath*:applicationContext*.xml"});

}

另外测试基类还要完成一个很重要的工作就是要解决Hibernate的LazyLoad问题,做到OpenSession In Test。因此,SpringSide专门封装了一个XFireTestCase的基类。

3.2 用Client代码直接测试

下文直接用client代码调用findBooksByCategory方法,得到返回值后进行各种Assert判断。

注意和普通client code的两处区别:servericeURL换成local,factory须加入getXFire()作参数。

Service serviceModel = new ObjectServiceFactory().create(BookService.class);

XFireProxyFactory factory = new XFireProxyFactory(getXFire());

BookService service = (BookService) factory.create(serviceModel, "xfire.local://BookService");

List list = service.findBooksByCategory("0");

assertNotNull(list);

...

3.3 纯服务端测试

编写一段SOAP XML,以任意命名保存,下文以"Java"作参数,调用findBooksByName方法。

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">

<env:Header/>

<env:Body>

<findBooksByName xmlns="http://www.springside.org.cn">

<in1>Java</in1>

</findBooksByName>

</env:Body>

</env:Envelope>

测试代码调用前面的XML,返回XML Document对象,再用基类提供的一些Assert方法检查结果:

Document doc = invokeService("BookService","/org/springside/xfire/BookService.FindBooksByName.xml");

assertNoFault(doc);

addNamespace("ss", "http://domain.commons.bookstore.springside.org");

assertValid("//ss:Book/ss:category/ss:descn= "Java Book"", doc);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有