我使用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>
2 回答
为simpleJDBCTemplate bean添加scope = "prototype"定义 . 然后Spring Framework将为每个servlet实例创建新实例 . 有关bean范围的更多信息:http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes
为什么不尝试传入DataSource引用而不是JdbcTemplate . 通常的做法是注入数据源并在数据源的setter中创建JdbcTemplate . 您将在spring文档中找到以下示例:
如果您不想使用XML设置bean,也可以在setDataSource方法上使用@Autowired . 有关详细信息,请查看优秀 spring 文档的JdbcTemplate best practices部分 .