如何在没有Spring或AOP的情况下处理JAX-WS中的跨领域问题?处理程序?

时间:2009-09-23 19:29:32

标签: web-services soap aop jax-ws handlers

但我确实有一些更具体的内容:

每个Web服务方法都需要包含一些锅炉位置代码(横切关注,是的,Spring AOP在这里工作得很好,但它要么不起作用,要么不被gov't architecture group批准)。一个简单的服务电话如下:

@WebMethod...
public Foo performFoo(...) {

   Object result = null;
   Object something = blah;
   try {
      soil(something);

      result = handlePerformFoo(...);
    } catch(Exception e) {
       throw translateException(e);
    } finally {
       wash(something);
    }
    return result;
}

protected abstract Foo handlePerformFoo(...);

(我希望这是足够的背景)。基本上,我想要一个钩子(它在同一个线程中 - 就像一个方法调用拦截器)可以有一个before()和after(),它可以在每个方法调用周围调整(某些东西)和清洗(某些东西)疯狂的WebMethod。

无法使用Spring AOP,因为我的Web服务不是Spring托管bean:(

HELP !!!!!提出建议!请不要让我复制粘贴锅炉板10亿次(按照我的指示)。

此致 LES

3 个答案:

答案 0 :(得分:1)

自Spring出局以来,AspectJ是一个选择吗?

或者,您可以使用Reflection,并重新设计您的应用程序以使用此概念吗?

有关反思的评论,您可以查看以下文章: http://onjava.com/pub/a/onjava/2007/03/15/reflections-on-java-reflection.html

或者重新设计你的类以使用抽象类,因此performFoo将在抽象类中,因此你不需要复制和粘贴。你的例子几乎就在那里。

答案 1 :(得分:0)

我最终使用了JAX-WS Commons Spring Extention并使我的网络服务成为一个弹簧托管bean,并在一个地方使用周围的建议来处理所有锅炉板。

如果我想保持没有AOP的原始约束,我想我可以创建一个接口和一个帮助方法,如下所示:

interface Operation<T> {
    T execute();
}

public T doOperation(Operation<T> op) {

    // before advice

    try {
        return op.execute();
    } catch(Throwable ex) {
        // handle ...
    } finally {
        // clean up ...
    }
}

最后,业务方法的编码如下:

public Result computeResult(final String item, final int number) {
    return doOperation(new Operation<Result>(){
        public Result execute() {
            return new Result(item + ": processed", number * 5);
        }
    });
}

基本上,每个业务方法都会在其主体中使用doOperation帮助器方法,并且包含需要在doOperation方法创建的上下文中执行的代码的匿名类。我确定这个模式有一个名字(让我想起贷款模式)。

答案 2 :(得分:0)

最好的方法是使用处理程序,但您必须使用@HandlerChain注释注释所有服务:

@WebService(name = "AddNumbers")
@HandlerChain(file = "handlers.xml")  // put handlers.xml in WEB-INF/classes
public class AddNumbersImpl implements AddNumbers
{
...
}

文件 handlers.xml 将定义您的处理程序:

<handler-chains xmlns="http://java.sun.com/xml/ns/javaee" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">
  <handler-chain>
    <handler>
      <handler-name>LoggingHandler</handler-name>
      <handler-class>demo.handlers.common.LoggingHandler</handler-class>
    </handler>
  </handler-chain>
</handler-chains>

最后,像这样实现你的Handler类:

public class LoggingHandler implements SOAPHandler<SOAPMessageContext> {

   // this is called before invoking the operation and after invoking the operation
   public boolean handleMessage(SOAPMessageContext ctx) {
      log(ctx);
      return true;
   }

   public boolean handleFault(SOAPMessageContext ctx) {
      log(ctx);
      return true;
   }
}

更多详情here