2012-04-03 34 views
-1

我從兩天就陷入了一個問題,我無法擺脫這個困境。JSF ManagedBean - 注入的屬性在STATE_SAVING_METHOD = client上不能正常工作

我遇到的問題是使用反序列化後的MangedBean屬性(我猜)。
屬性(purchaseManager)使用Spring進行設置,並使用擴展MyBatis作爲數據映射器的DAO與數據庫進行交互。
事實上,在第一次訪問頁面時,init()方法內的purchaseManager.getAll()工作正常。
當我嘗試從一個按鈕調用refreshList()作爲一個動作時,我在DAO中的getSqlSession()上有一個NullPointerException。

讓只有相關的代碼的情況如下:如果我改變STATE_SAVING_METHOD到服務器的應用程序工作正常,但不是我想要的

@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> 

。如果我將ManageBean設置爲RequestScope,但同樣也會懲罰我的需求。

預先感謝任何人提供任何形式的幫助! Ermal

+0

我不做春天,所以我可能是完全錯誤的,但爲什麼你試圖注入一個Spring管理的bean作爲JSF管理的屬性?我從來沒有見過這個。 Spring對此有自己的註釋。 – BalusC 2012-04-03 02:57:48

+0

在Spring基礎結構中,我有邏輯(DAO和服務),它是兩個其他Web應用程序Front-End和Admin-Tool使用的自己的項目BL。很多參考資料都顯示了將ManagedBeans注入爲其他託管bean的屬性的方式。這裏有一個例子:http://www.mkyong.com/jsf2/injecting-managed-beans-in-jsf-2-0/ – Ermal 2012-04-03 03:31:34

+0

是的,我知道如何注入JSF託管的bean的工作,但你正在治療一個Spring管理bean作爲JSF管理的bean。如果它是一個EJB(Spring應該取而代之),那麼你應該使用'@ EJB'而不是'@ ManagedProperty',它將基本上注入一個完全可序列化的代理實例。 Spring是否真的沒有一些註解? '@ Autowired'左右嗎? – BalusC 2012-04-03 10:42:43

回答

0

解決了錯誤,將<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> 

proxy-target-class="false"是,告訴PurchaseManagerImpl已經實現的接口。如果設置爲true或省略,則必須使用CGLIB2庫。

通過這種方式,JSF使用Spring + MyBatis正確地從數據庫中獲取數據。

的這一點(更多理論框架)(對我來說)是謎:

  • 是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 session-scoped beans (controllers) and references to services, in terms of serialization

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes-other-injection

http://www.infoq.com/presentations/Whats-New-in-Spring-3.0

+0

解決了這個錯誤。將這個問題設置爲接受,也許可以幫助其他人解決同樣的問題。 – Ermal 2016-10-12 21:06:54