2

私はこのコードを持っています:

<p:inplace id="staffno" editor="true">
                    <p:ajax event="save" listener="#{staffbean.onSave}" update="staffnoInplace messages" />                    
                    <p:inputText id="staffnoInplace" value="#{staffbean.vieweditStaff.staffno}"/>                                                 
</p:inplace>  

staffbean.onSave() では、JPA/Hibernate を介してこれを保存します。成功した場合、私は問題に直面しません。DBに保存されます。

私の問題は、DB の制約が原因で Hibernate が例外をスローする場合に関係しています。そのような場合、インプレースを編集可能な状態のままにし、値を変更しないようにしたいと思います。現在、DB レベルでは失敗しますが、UI オブジェクトの値が正しくない値に変更されています。

4

1 に答える 1

2

コンポーネントの検証メソッドまたはバリデーターを含めてinputText、Bean 値を逆にしonSave、指定された ID がデータベースに既に存在する場合にイベントが実行されないようにする必要があります。

データベースの制約が検証を提供することを期待して、故意にデータベースにレコードを挿入しようとすることは、あいまいなデータ セキュリティの実践です。データベースの制約が悪いと言っているのではありません。データベースに挿入する前に、入力を検証してサタンタイズするためにあらゆる試みを行う必要があると言っているだけです。

次のような検証メソッドをマネージド Bean に含めます。

public void validateStaffNoId(FacesContext context, UIComponent component, Object value)
        throws ValidatorException {
    //Query DB to see if ID exists...
    if (idExists()) {
        //Throw validator exception
    }
}

次に、inputText コンポーネントに属性を追加するだけです。

<p:inputText ... validator="#{staffBean.validateStaffNoId}" ... />
于 2012-10-15T11:39:01.123 に答える