首页 文章

SimpleJdbcTemplate不可序列化

提问于
浏览
1

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

    为simpleJDBCTemplate bean添加scope = "prototype"定义 . 然后Spring Framework将为每个servlet实例创建新实例 . 有关bean范围的更多信息:http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes

  • 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 . 有关详细信息,请查看优秀 spring 文档的JdbcTemplate best practices部分 .

相关问题