2016-01-10 34 views
0

我的项目使用的是Spring Web Flow 2.4,我需要使用Spring AOP来指导流程作用域bean来处理像日志记录这样的方面要求。 这里是方面类:如何在Spring Webflow中建议flowcope bean

@Aspect 
@Component 
public class LogFlowEventExecutor { 
    @Pointcut("execution(public * com.xyz.app.flow.*FlowBean.*(..))") 
    private void flowFunction() {} 

    @Before("flowOperation()") 
    public void logFlowEvent(JoinPoint jp) throws Throwable { 
     //logic ignored 
     ... 
    } 
} 

,并限定了根WebApplicationContext自动代理:

<aop:aspectj-autoproxy /> 

而且每个单独的文件-flow.xml

<flow xmlns="http://www.springframework.org/schema/webflow"...> 
    <var name="abcFlowBean" class="com.xyz.app.flow.AbcFlowBean" /> 
    ... 
</flow> 

我使用的相同的模式,以轻松建议服务bean和控制器,但它不适用于流程范围的bean,该方面从未执行。 我认为它可能是JDK动态接口代理的东西,但是它也失败了CGLIB(proxy-target-class =“true”属性被设置)。切入点从未被拦截。所以我怀疑流程范围bean在实例化时从未正确代理过。

我试着切换到LTW,但它抛出了一个NoSuchMethodError(这个bean是由weaveinfo日志编织而成的)。也许最好为此单独打开另一个线程。

我的问题是,是否可以使用Spring AOP来建议一个流作用域bean,以及如何做到这一点?

回答

0

我通过编写Flow Execution Listener来解决这个问题,FlowExecutionListener基本上定义了很多回调方法,当流程执行生命周期过程中发生某些事情时会调用这些回调方法。所以我创建了一个自定义的监听器类,它扩展自FlowExecutionListenerAdapter,它通过使用空方法体实现所有方法并覆盖我感兴趣的内容,如果您希望在所有流范围bean上进行全局回调,则它几乎具有与AOP类似的效果。但是如果你只需要拦截其中的一些,那么这就是另外一个故事。

public class MyFlowExecutionListener extends FlowExecutionListenerAdapter{ 
    @Override 
    public void eventSignaled(RequestContext context, Event event) {...} 
    @Override 
    public void transitionExecuting(RequestContext context, TransitionDefinition transition) {...} 
    @Override 
    public void viewRendered(RequestContext context, View view, StateDefinition viewState) {...} 
    @Override 
    public void exceptionThrown(RequestContext context, FlowExecutionException exception) {...} 
    ... 
}