0

但是,我确实有更具体的想法:

每个 Web 服务方法都需要用一些锅炉位置代码进行包装(横切关注点,是的,spring AOP 在这里可以很好地工作,但它要么不起作用,要么未经政府架构组的批准)。一个简单的服务调用如下:

@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 :(

帮助!!!!!提出建议!请不要让我复制粘贴该样板 10 亿次(正如我被指示做的那样)。

问候, LES

4

3 回答 3

1

自从 Spring 结束后,AspectJ 是一种选择吗?

或者,您可以使用反射,然后重新设计您的应用程序以使用此概念吗?

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

或者重新设计您的类以使用抽象类,因此 performFoo 将在抽象类中,因此您无需进行复制和粘贴。在您的示例中,您几乎就在那里。

于 2009-09-24T01:51:35.937 回答
0

我最终使用了JAX-WS Commons Spring Extention并使我的 web 服务实现了一个 spring 管理的 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 方法创建的上下文中执行的代码。我确定这种模式有一个名称(让我想起了贷款模式)。

于 2010-03-03T04:11:24.777 回答
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;
   }
}

更多细节在这里

于 2010-08-11T18:24:12.277 回答