3

我对使用 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>

如何解决这个问题?

4

1 回答 1

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 代理不起作用,因为在反序列化期间接口不可用......我不完全理解为什么,但至少我有工作解决方案。

于 2012-12-14T15:05:03.807 回答