我使用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>
答案 0 :(得分:1)
为什么不尝试传入DataSource引用而不是JdbcTemplate。通常的做法是注入数据源并在数据源的setter中创建 JdbcTemplate 。您将在spring文档中找到以下示例:
public class JdbcCorporateEventDao implements CorporateEventDao {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// JDBC-backed implementations of the methods on the CorporateEventDao follow...
}
如果您不想使用XML设置bean,也可以在 setDataSource 方法上使用@Autowired。有关详细信息,请查看优秀弹簧文档的JdbcTemplate best practices部分。
答案 1 :(得分:0)
为simpleJDBCTemplate bean添加scope =“prototype”定义。然后Spring Framework将为每个servlet实例创建新实例。有关bean范围的更多信息:http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes