Spring SimpleJdbcTemplate不可序列化
我使用JSF和Spring。JSFbean必须是设计上可序列化的。JSF bean注入了处理db访问的springbean。因此,这些bean也必须是可序列化的。但是simpleJdbcTemplate是不可序列化的,因此我在重新启动servlet和会话时会得到堆栈跟踪。如果我将simpleJdbcTemplate声明为瞬态,我不会得到关于“不可序列化”的堆栈跟踪,但是simpleJdbcTemplate在重新启动后有时为空,这更糟糕 那么,当servlet重新启动时,我该怎么做才能让Springbean注入“新鲜”的simpleJdbcTemplate呢 这些类如下所示:Spring SimpleJdbcTemplate不可序列化,spring,jsf,Spring,Jsf,我使用JSF和Spring。JSFbean必须是设计上可序列化的。JSF bean注入了处理db访问的springbean。因此,这些bean也必须是可序列化的。但是simpleJdbcTemplate是不可序列化的,因此我在重新启动servlet和会话时会得到堆栈跟踪。如果我将simpleJdbcTemplate声明为瞬态,我不会得到关于“不可序列化”的堆栈跟踪,但是simpleJdbcTemplate在重新启动后有时为空,这更糟糕 那么,当servlet重新启动时,我该怎么做才能让Sprin
@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>
<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>
<application>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
<application>
<message-bundle>jsf</message-bundle>
</application>
</application>
org.springframework.web.context.ContextLoaderListener
org.springframework.web.util.Log4jConfigListener
org.springframework.web.context.request.RequestContextListener
Listeners.SessionListener
applicationContext.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>
<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>
<application>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
<application>
<message-bundle>jsf</message-bundle>
</application>
</application>
faces-config.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>
<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>
<application>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
<application>
<message-bundle>jsf</message-bundle>
</application>
</application>
org.springframework.web.jsf.DelegatingVariableResolver
jsf
为什么不尝试传入数据源引用而不是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文档部分。为什么不尝试传入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文档部分。为SimpleJDBCTemplatebean添加scope=“prototype”定义。然后Spring框架将为每个servlet实例创建新实例。关于bean作用域的更多信息:为SimpleJDBCTemplatebean添加scope=“prototype”定义。然后Spring框架将为每个servlet实例创建新实例。有关bean作用域的更多信息:谢谢。。。遗憾的是,很难说它是否有效——问题已经转移到另一个“黑暗”领域:SCHWERWIEGEND:从持久性存储java.lang.ClassNotFoundException加载会话异常:SpringDB.xxxxxx DAO$$EnhancerByGlib$$6882b86f,这与我使用@Transactional和cglib proxy有关:-(我在没有@Transactional的情况下做了一个测试,得到了一个NullPointerException。跟踪显示setDataSource()没有被调用:-(谢谢…很遗憾,很难说它是否有效-问题已经转移到另一个“黑暗”状态)区域:SCHWERWIEGEND:从持久性存储java.lang.ClassNotFoundException加载会话的异常:SpringDB.xxxxxx DAO$$EnhancerByGlib$$6882b86f,这与我使用@Transactional和cglib proxy:-(我在没有@Transactional的情况下进行了测试,得到了一个NullPointerException。跟踪显示未调用setDataSource():-(