我遇到了两天的问题,无法摆脱。
我遇到的问题是在反序列化之后使用MangedBean属性(我想)
属性(purchaseManager)是用Spring设置的,并使用一个扩展MyBatis的DAO作为数据映射器来与DB交互
事实上,在第一次访问页面时,init()方法中的purchaseManager.getAll()运行良好
当我尝试从按钮调用refreshList()作为操作时,我在DAO内的getSqlSession()上有一个NullPointerException。
只让相关代码的情况如下:
@ManagedBean(name = "purchaseController")
@ViewScoped
public class PurchaseController implements Serializable{
@ManagedProperty(value = "#{purchaseManager}")
private PurchaseManager purchaseManager;
@PostConstruct
public void init(){
purchaseManager.getAll();
}
public void refreshList(){
purchaseManager.getAll();
}
}
public class PurchaseManagerImpl implements PurchaseManager, Serializable {
PurchaseDAO purchaseDAO;
public void getAll() {
purchaseDAO.getAll()
}
}
public class PurchaseDAOImpl extends SqlSessionDaoSupport implements PurchaseDAO, Serializable {
public void getAll() {
SqlSession session = getSqlSession(); // when the call comes from refreshList(), session is null
session.selectList("PAYMENT.getAll", null);
}
}
in web.xml
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
如果我将STATE_SAVING_METHOD更改为服务器,则应用程序运行良好,但不是我想要的。如果我将ManageBean作为RequestScope,也是一样的,但这也会惩罚我的需求。
提前感谢任何人的帮助!Ermal
解决了将<aop:scoped-proxy proxy-target-class="false" />
添加到通过Spring声明的服务/管理器的定义中的错误。这使得注入完全可串行化的代理实例成为可能。
<bean id="purchaseManager" class="al.ozone.bl.manager.impl.PurchaseManagerImpl">
<property name="purchaseDAO" ref="purchaseDAO" />
<aop:scoped-proxy proxy-target-class="false" />
</bean>
CCD_ 2用于说明CCD_ 3已经实现了一个接口。如果设置为true
或省略,则必须使用CGLIB2库。
通过这种方式,JSF使用Spring+MyBatis从DB中正确地获取数据。
(对我来说)关于这一点(更具理论性)的误解是:
- MyBatis对象(
PurchaseDAOImpl
)和dataSource
是否在幕后得到了正确处理 - 它们是在每个HTTP请求上重新创建还是恢复的
请记住,我有STATE_SAVING_METHOD=client
和BackingBean作为ViewScope
我的目标是让服务器尽可能轻,因为我期望有大量的用户交互。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="poolPreparedStatements" value="true" />
<property name="defaultAutoCommit" value="false" />
</bean>
非常感谢大家对此事的了解!
咨询链接:
在序列化方面,Spring会话范围的bean(控制器)和对服务的引用
http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-工厂范围其他注射
http://www.infoq.com/presentations/Whats-New-in-Spring-3.0