0

最初に言いたいのは:

以下は私のコードです:

*.xhtml

<rich:column>
     <h:selectBooleanCheckbox  id="resolveTxn" value="#{verifyTransactionBean.checked[verifyTxnList.id]}"/>
</rich:column>
.
.//Some code here
.
<h:commandButton value="Resolve" action="#{verifyTransactionBean.resolveToTxn}"  styleClass="btn" />

以下は私のコードです

private Map<Long, Boolean> checked = new HashMap<Long, Boolean>();

public void resolveToTxn() {
    List<ToVerifyTxnDTO> list = new ArrayList<ToVerifyTxnDTO>();
    for (ToVerifyTxnDTO dTO : toVerifyTxnDTOList) {
        if(checked.get(dTO.getId())){//I got null pointer exception here
           Long id=dTO.getId(); 
           verifyTransactionSessionBeanLocal.updateResolvedflag(id);
        }
    }

}

私がしたいこと ?

次のパラメータとしてチェックされた行IDを渡したい:

verifyTransactionSessionBeanLocal.updateResolvedflag(id);

ボタンをクリックした後、何らかの操作を行い、同じページResolveを更新して表示する必要があります。dataTable操作はできているがnull pointer exception、同じページを表示(赤化)しながら取得

ありがとう

4

1 に答える 1

1

aのif ()テストは、それ自体が実際にorの代わりである場合Booleanにスローされます。つまり、 なんらかの理由で予期せず戻ってきたということです。NullPointerExceptionBooleannulltruefalsechecked.get(dTO.getId())null

これにはいくつかの原因が考えられます。

  • 何らかの理由で、JSF 実装がchecked値 from でマップを適切に更新していません。<h:selectBooleanCheckbox>
  • EL 実装では、何らかの理由Booleanで代わりに使用していました。boolean
  • がプロセス中に非互換に変更されたtoVerifyTxnDTOListため、現在反復dTOされているものが、チェックボックスがクリックされた時点でテーブルに表示されていたものではなくなりました (おそらく、Bean がビュー スコープではなくリクエスト スコープであるため)。
  • ページネーションを使用していて、一度にサブセットのみを表示しているためtoVerifyTxnDTOList、 にはマップに存在するよりも多くのアイテムが含まれています。checked

いずれにせよ、を修正するにはNullPointerException、nullcheck を追加するだけです。

Boolean dtoChecked = checked.get(dTO.getId());

if (dtoChecked != null && dtoChecked) {
    // ...
}

ただし、これは問題の根本的な原因を解決するものではありません。私の最善の推測はtoVerifyTxnDTOList、テーブルに実際に表示されているよりも多くのアイテムが含まれていることです。したがって、リストに記載されている最後の 2 つの原因の 1 つです。最初に述べた 2 つの原因は理論的には可能ですが、実際にはこれまで見たことがありません。

于 2013-09-06T11:26:28.793 に答える