跳到导航
BEA Dev2Dev Oracle and BEA
首页 资源中心 dev2dev学堂 在线技术论坛 User Group CodeShare
dev2dev 首页 > 资源中心 > 专家Blog > 专家Blog文章
为服务控件添加handler

时间:2007-03-13
作者:Chris Hogue
浏览次数:
本文关键字:javaWeb ServicesControlsXMLBEA Workshophandler服务控件
文章工具
推荐给朋友 推荐给朋友
打印文章 打印文章

  处理Web service有时需要直接处理传入和传出的消息。标准的做法是使用在客户端或服务器上注册的handler。handler可以检测传入和传出的消息,在使其到达终点、写入日志信息之前修改消息。

  大多数客户端技术支持某种handler,通常使用标准的JAX-RPC handler API

  Workshop服务控件就是这样的技术。有时使handler正确注册可能会比较复杂,所以我会介绍几种完成注册的方法。

  在服务控件上注册handler的主要方法是使用@ServiceControl。handler注释如下所示:

...
@ControlExtension
@ServiceControl.Handler(operation={"client.ClientHandler"})
public interface TargetServiceControl extends ServiceControl {
...

  这里'operation'属性的名称不够直观,它是一组字符窜,用于指定在服务控件发送和接收消息时将会调用的handler类名称。所有handler类必须实现javax.xml.rpc.handler.Handler接口(实现它的最简单方法是成为GenericHandler的子类)。

  有些人使用这个注释有问题。如果您是其中一员,也可以用另一种方法注册handler,那就是在服务控件底层的JAX-RPC存根上用编程方式完成注册。下面是这种做法的一个示例:

Stub stub = targetServiceControl.getStub();
HandlerRegistry reg = 
    (HandlerRegistry)stub._getProperty(WLStub.HANDLER_REGISTRY);
List handlers = new ArrayList();
handlers.add(new HandlerInfo(
          ClientHandler.class,
          new HashMap(),
          new QName[]{new QName("http://services","SomeHeader")}));
reg.setHandlerChain(
          new QName("http://services","TargetServiceSoapPort"),
          handlers);

  这段代码首先从服务控件中获取存根,然后从存根中取得HandlerRegistry。为了用handler链实际注册handler,您需要告诉它handler感兴趣的报头是什么,如上面代码中QName参数在"handlers.add..."行中指定的那样。

  最后,handler链放入HandlerRegistry中。最后一行的QName是该handler将要侦听的服务端口(不是端口类型)名称。端口名称及其包含的名称空间可以在用于生成服务控件的WSDL中找到。

  这样尽管这种方法不如使用注释方便,但它确实使您对如何注册handler有了更多控制,并且可以解决使用注释可能出现的种种问题。

  有关底层JAX-RPC API的更多信息,请参阅关于javax.xml.rpc.* package的J2EE文档。

  在我下面的一些文章中将描述一些您在服务控件中可能会遇到的handler的使用。

原文出处:http://dev2dev.bea.com/blog/hogue/archive/2007/01/adding_handlers.html

dot dot dot

dot
  作者其它文章
您对本文的评价
您对这篇文章的看法如何?
太棒了!5分 不错啊 4分 一般般 3分 有待提高 2分 不好 1分

   
相关产品
相关技术