大梦想家

5年开发工程师,2年实施经理,X年售前顾问,......
数据加载中……
EJB3下无状态会话Bean发布为WebService

    无状态会话Bean发布为WebService是非常有意义的,因为如果我们将每一个EJB模块按照SOA的思想做成一个一个独立的服务模块(这里不讨论SCA,我认为Apache的SCA框架还不够强大,文档还不够全面),同样的代码在JavaEE体系之内的应用程序可以直接使用EJB3直接访问,JavaEE体系之外的应用程序可以直接使用WebService访问,这一点是非常有意义的。

    下面要考虑的就是如何只写一份代码,让它能做两样事情。

    网上有大量的使用EJB3发布WebService的教程,但是这些教程都是一个人写的,基本上没有太大的参考价值。最重要的是,他写的元注释都是写在实现类上的,接口上没有做任何描述。这种做法有两个问题,第一如果你的会话Bean使用了EM,那么麻烦了,JAXB在做绑定的时候不认识接口;第二WSDL文件的描述实际上应该是基于接口的描述,应该和实现类没有太大的关系。

    看看网上流行的代码:

 

1@WebService(name = "PurchaseArrival", serviceName = "PurchaseArrivalService"
2@SOAPBinding(style = SOAPBinding.Style.RPC) 
3public class PurchaseArrivalImpl implements IPurchaseArrival {

 

注意,基于RPC绑定模式下List,Set一类的接口都是不可传输的,这点会很麻烦,要用必须用实现类。

看看我的代码:

接口:

 

1@WebService(name = "ILogRemoteService",targetNamespace = "http://www.glnpu.com/dmp/xml"
2@SOAPBinding(style = SOAPBinding.Style.DOCUMENT) 
3public interface  ILogRemoteService {

 

实现类:

 

1@Stateless 
2@Remote(ILogRemoteService.class
3@WebService(endpointInterface = "com.glnpu.dmp.server.service.base.log.ILogRemoteService",serviceName = "LogRemoteService"
4public class LogRemoteService extends BaseService implements ILogRemoteService {

 

这个WebService是针对接口发布出去,而且使用的DOCUMENT样式,可以直接使用List、Set的接口。

这个WebService生成的WSDL文件很有意思:

 

 1<definitions name="LogRemoteService" targetNamespace="http://impl.log.base.service.server.dmp.glnpu.com/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://www.glnpu.com/dmp/xml" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://impl.log.base.service.server.dmp.glnpu.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 2
 3<import location="http://127.0.0.1:8080/LogRemoteServiceService/LogRemoteService?wsdl&resource=ILogRemoteService_PortType25057.wsdl" namespace="http://www.glnpu.com/dmp/xml" />
 4
 5<service name="LogRemoteService">
 6
 7<port binding="ns1:ILogRemoteServiceBinding" name="LogRemoteServicePort">
 8
 9<soap:address location="http://127.0.0.1:8080/LogRemoteServiceService/LogRemoteService" />
10
11</port>
12
13</service>
14
15</definitions>
16
17

 

里面有import来指引到真正的WSDL文件。这样很容易将会话Bean变成WS~一样的代码两样的功能,超值!



客户虐我千百遍,我待客户如初恋!

posted on 2009-07-02 13:54 阿南 阅读(1938) 评论(0)  编辑  收藏 所属分类: EJB3个人原创


只有注册用户登录后才能发表评论。


网站导航: