如何在Spring webflow中建议flowcope bean

时间:2016-01-10 06:09:40

标签: java spring spring-webflow spring-aspects

我的项目正在使用Spring web flow 2.4,我需要使用Spring AOP来建议流作用域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中定义autoproxy:

<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 =&#34; true&#34;属性已设置)。切入点从未被截获。所以我怀疑流量范围bean在实例化时从未正确代理过。

我试图切换到LTW,但它抛出了NoSuchMethodError(bean是从weaveinfo日志编织的)。也许最好还是单独打开另一个线程。

我的问题是,是否可以使用Spring AOP来建议流量范围bean以及如何进行操作?

1 个答案:

答案 0 :(得分: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) {...}
    ...
}