JSF bean和可序列化问题

时间:2012-11-21 15:57:37

标签: spring jsf jsf-2

我使用Spring托管服务的JSF bean有问题。我得到一个错误告诉,JSF bean中使用的spring bean不可序列化。

@ManagedProperty("#{customerService}")
private CustomerService customerService;

我无法使服务可序列化,因为它使用的JdbcTemplate本身不可序列化。此外,序列化具有应用程序范围的Spring bean根本没有意义,所以我不明白,为什么有人的代码试图序列化它们。

我使用Spring服务与JSF项目合作,没有这样的问题,所以这种合作必须是可能的。但是这个项目是基于示例项目从头开始制作的,所以spring-JSF合作的配置一定有问题,但我不知道在哪里搜索。

Spring for JSF的配置是:

<!-- JSF and Spring are integrated -->
<application>
    <el-resolver>
        org.springframework.web.jsf.el.SpringBeanFacesELResolver
    </el-resolver>
</application>

如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

没有办法避免JSF序列化。甚至ApplicationScoped bean也被序列化(当它们被注入其他bean时)。

但解决方案是在Spring方面做出的。您必须使用范围代理

要将bean包装到可序列化的代理中,您必须添加到bean主体:

<aop:scoped-proxy proxy-target-class="true"/>

必须添加spring aop名称空间和spring-aop依赖项。

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

就是这样!在bean中将是可序列化元素,该代理将在反序列化时从Spring上下文重新加载bean。

这里唯一的错误是我必须创建 cglib 类级别代理。 JRE代理无法正常工作,因为在反序列化过程中界面不可用...我不完全理解为什么,但我至少有工作解决方案。