【发布时间】:2011-09-13 04:30:48
【问题描述】:
我使用 JSF 和 Spring。 JSF bean 在设计上必须是可序列化的。 JSF bean 被注入处理数据库访问的 Spring bean。因此,这些 bean 也必须是可序列化的。但是 simpleJdbcTemplate 是不可序列化的,因此在重新启动 servlet 时我会得到堆栈跟踪,并且会话丢失。如果我声明 simpleJdbcTemplate 是瞬态的,我不会得到关于“不可序列化”的堆栈跟踪,但是 simpleJdbcTemplate 有时在重新启动后为 NULL,这更糟。
那么,当 servlet 重新启动时,我该怎么做才能让 spring bean 注入一个“新鲜的”simpleJdbcTemplate?
类如下所示:
@Repository
public class Users implements Serializable
{
@Autowired
private SimpleJdbcTemplate simpleJdbcTemplate;
// ...
}
@ManagedBean
@SessionScoped
public class ThisBean implements Serializable
{
@ManagedProperty(value = "#{users}")
private Users users;
public void setUsers(Users users)
{
this.users = users;
}
// ...
}
现在是一些配置文件,只是为了让您看到我没有遗漏一些标准。
web.xml 有这个:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
<listener-class>Listeners.SessionListener</listener-class>
</listener>
applicationContext.xml 有这个:
<context:annotation-config />
<context:component-scan base-package="SpringDB"/>
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/mysql"/>
<bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg>
<ref bean="dataSource"/>
</constructor-arg>
</bean>
faces-config.xml 有这个:
<application>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
<application>
<message-bundle>jsf</message-bundle>
</application>
</application>
【问题讨论】: