SimpleJdbcTemplate不可序列化

时间:2011-06-11 20:37:17

标签: spring jsf

我使用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 个答案:

答案 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