2012-04-03 19 views
-1

私は2日間で問題が発生しましたが、私はこの問題を解決できません。JSF ManagedBean - 注入されたプロパティが正しく動作しないSTATE_SAVING_METHOD =クライアント

私が抱えている問題は、デシリアライゼーション後にMangedBeanプロパティを使用していることです(私は推測します)。
プロパティ(purchaseManager)はSpringで設定され、MyBatisをデータマッパーとして拡張してDBと対話するDAOを使用します。
実際、ページへの最初のアクセスでは、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

+0

私は春をしないので、私は完全に間違っているかもしれないが、なぜあなたは管理対象Bean春を注入しようとしていますJSF管理プロパティとして私はこれを見たことがない。 Springには独自のアノテーションがあります。 – BalusC

+0

Springインフラストラクチャでは、フロントエンドと管理ツールの2つのWebアプリケーションで使用される独自のプロジェクトBLであるロジック(DAOとサービス)があります。多くの参考文献は、ManagedBeansを他のマネージドBeanのプロパティとしてインジェクトする方法を示しています。ここでは例を示します:http://www.mkyong.com/jsf2/injecting-managed-beans-in-jsf-2-0/ – Ermal

+0

はい、私はJSFマネージドBeanの注入方法を知っていますが、Spring管理対象JSFマネージドBeanとしてのBean。それがEJB(Springが代わるもの)であれば、基本的に完全直列化可能なプロキシインスタンスを挿入する '@ManagedProperty'の代わりに' @ EJB'を使用していました。春には本当にそのための注釈がありませんか? '@ Autowired'かそれとも? – BalusC

答えて

0

Springで宣言されたservice/managerの定義に<aop:scoped-proxy proxy-target-class="false" />を追加するエラーを解決しました。これにより、完全直列化可能なプロキシインスタンスの注入が可能になります。

<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を使用してDBからデータを正しく取得しています。この時点(もっとtheorical)上の(私にとっては)

謎は次のとおりです。

  • が正しく舞台裏取り扱いMyBatisのオブジェクト(PurchaseDAOImpl)とdataSource、ですか?
  • HTTP要求ごとに再作成または復元されますか?

私はViewScopeとしてSTATE_SAVING_METHOD=clientとBackingBeanを持っていることを忘れないでください。
私の目標は、ユーザーの操作が非常に多いと予想しているため、サーバーの軽量化を可能にすることです。

<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

関連する問題