但我确实有一些更具体的内容:
每个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
答案 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。