Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring SimpleJdbcTemplate不可序列化_Spring_Jsf - Fatal编程技术网

Spring SimpleJdbcTemplate不可序列化

Spring SimpleJdbcTemplate不可序列化,spring,jsf,Spring,Jsf,我使用JSF和Spring。JSFbean必须是设计上可序列化的。JSF bean注入了处理db访问的springbean。因此,这些bean也必须是可序列化的。但是simpleJdbcTemplate是不可序列化的,因此我在重新启动servlet和会话时会得到堆栈跟踪。如果我将simpleJdbcTemplate声明为瞬态,我不会得到关于“不可序列化”的堆栈跟踪,但是simpleJdbcTemplate在重新启动后有时为空,这更糟糕 那么,当servlet重新启动时,我该怎么做才能让Sprin

我使用JSF和Spring。JSFbean必须是设计上可序列化的。JSF bean注入了处理db访问的springbean。因此,这些bean也必须是可序列化的。但是simpleJdbcTemplate是不可序列化的,因此我在重新启动servlet和会话时会得到堆栈跟踪。如果我将simpleJdbcTemplate声明为瞬态,我不会得到关于“不可序列化”的堆栈跟踪,但是simpleJdbcTemplate在重新启动后有时为空,这更糟糕

那么,当servlet重新启动时,我该怎么做才能让Springbean注入“新鲜”的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>
<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():-(