2017-09-29 29 views
0

ビジネス検証後、私はUIInputを無効に設定して、赤色になり、何が間違っているかをユーザーに伝えます。ここに私のコードは次のとおりです。JSF/PrimeFacesのプログラムで無効化された入力クリア値

<p:outputLabel value="Label" for="input"/> 
<p:inputText id="input" value="#{bean.selectedEntity.input}"/> 
<p:commandButton value="#{msg['button.save']}" 
    icon="ui-icon-check" 
    action="#{bean.save()}" 
    update=":form, :growl" 
    oncomplete="if (args &amp;&amp; !args.validationFailed) PF('detailDlg').hide();" 
/> 

// bean code 
UIInput c = (UIInput) context.getViewRoot().findComponent("form:input"); 
c.setValid(false); 

コンポーネントは、赤取得しますが、テキストもクリアされます。私はちょっとした回避策を使って動作させることができます:

Object value = c.getValue(); 
c.setValid(false); 
c.setValue(value); 

これはバグですか?

ENV:あなたの要件がすでにJSFで覆われているPrimeFaces 6.1、JSFクロサギ科2.2.14、Javaの8、春ブーツ1.5.4

+0

通常のJSFバリデータを使用してみませんか? findComponent()、setValid()などで手作業をする必要はもうありません。 – BalusC

+0

サービスレイヤの保存フェーズ中に検証が行われます。これは、2つの他のソースからデータをインポートすることもできるためです。私は問題のあるフィールドで "BusinessValidationException"をキャッチすることができます... – Michal

答えて

0

、あなたはより多くの何もする必要はありません。 唯一のことは、標準の検証方法を使用することです。 Primefaceを使用している場合、検証に失敗した場合(およびフォームを更新する場合)、無効なコンポーネントにui-state-error cssクラスが自動的に追加されます。あなたはこのように上書きされ、ユーザーにカスタムエラーのスタイルを表示したい場合は

:今

.ui-inputfield.ui-state-error, .ui-selectonemenu.ui-state-error { 
    color: #dd6417 !important; 
    border: 1px solid #dd6417 !important; 
} 

は、コンポーネントが原因で、ターゲットBeanにクリアされ、あなたが値をクリアしたり、要求されています豆。

ビジネス検証(DBにアクセスして何かをチェックする)が必要な場合は、JSFバリデーターで隠しフィールドを作成することをお勧めします。

+0

私はcssクラスを追加することができますが、それは少しトリッキーだと思うし、 "正しい方法"でそれをやりたいと思います。私はちょうど不思議だった、なぜ入力がクリアされます。 Beanはビュースコープですが、値がデバッグ中に設定されているのがわかります。残念ながら、上記のように、検証はバックエンドで保存フェーズで実行されますが、JSFバリデーターに保存する前に実行できません。 – Michal

関連する問題