2012-11-02 1 views
2

나는 세 가지 엔티티에 대한 처리를 제공하는 플로우를 가지고있다. 따라서 공통 흐름 상태를 가진 부모 흐름 정의가 있고 구체적인 흐름 정의에서는 실제 데이터와 동작 구현으로 그 흐름을 확장합니다.스프링 webflow 변수 직렬화

엔티티를 처리하는 bean 인스턴스를 변수에 저장하고 싶으므로 상위 플로우 정의에서이 변수에 액세스 할 수 있습니다. concreteProcessor가 필요한 처리를 구현하는 싱글 콩 인 경우 부모의 흐름 (고화질)

<action-state id="prepareReview" > 
    <evaluate expression="processor.prepare(modelInstance)" /> 
    <transition to="check" /> 
</action-state> 

에서 콘크리트 플로우 정의에서

나는

<on-start> 
    <set name="flowScope.processor" value="concreteProcessor"/> 
</on-start> 

있습니다. 그것은 상태를 저장하지 않으므로 직렬화하는 데 쓸모가 없으며, 직렬화 할 수없는 HibernateDaoSupport를 사용하여 autowired dao 변수를 포함합니다.

이 문제를 극복하기위한 방법이 있습니까? 나는 하나의 해결책을 가지고있다. 그러나 구체적인 모든 플로우 정의에 구체적인 프로세서 메소드 호출의 보일러 플레이트 코드를 작성해야하므로 매우 편리하지는 않다.

<action-state id="prepareReview" parent="common#prepareReview"> 
    <evaluate expression="concreteProcessor.prepare(modelInstance)" /> 
</action-state> 

다소 번거롭습니다.

답변

0

당신은 당신의 ConcreteProcessor에 범위의 프록시를 사용할 수 있습니다

@Component 
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS,value=ConfigurableBeanFactory.SCOPE_SINGLETON) 

이 CGLIB 프록시 대신 ConcreteProcessor의 실제 인스턴스를 주입 할 것이다. 프록시는 직렬화 가능하며 비 직렬화 될 때 종속성을 다시 나타냅니다.

단점은 클래스 경로에 CGLIB가 있어야한다는 것입니다. 또는,

@Scope(proxyMode=ScopedProxyMode.INTERFACES,value=ConfigurableBeanFactory.SCOPE_SINGLETON) 

와 인터페이스 기반의 프록시를 사용하지만 ConcreteProcessor는 인터페이스를 구현해야합니다.