私があなたの問題を正しく理解していれば、元の値を保存する必要はありません。JSF ライフサイクルを活用します。
カスタム コンバーターに加えて、カスタム バリデーターも必要です。バリデーターで、変換された入力と db 上のデータとの間のチェックが成功した場合、getAsString
カスタム コンバーターは単に変換された入力を返します。ただし、変換が成功しても検証が失敗した場合 (つまり、db レコードに対するチェックが失敗した場合)、単純にValidatorExceptionをスローします。はgetAsString
呼び出されず、生の入力が表示されます。
これを達成する方法については、2 つの方法が考えられます。最初のアプローチでは、Bean 内でバリデーター メソッドを定義し、検証ロジックをそのメソッドに移動できます。例 :
public class Bean {
//Remainder omitted
public void validate(FacesContext fc, UIComponent uic, Object o) {
//Get the converted input. Assuming of type String
String convertedInput = (String) o;
//Move the db check in this method. If it fails simply throw
//a ValidatorException like below. If it succeeds, don't return anything
//throw new ValidatorException(new FacesMessage("Validation Failed"));
}
}
戻り値の型とパラメーターに注意してください。
次に、同様にvalidator
属性を追加します<h:inputText>
<h:inputText id="userId" value="#{bean.userId}" validator="#{bean.validate}">
このアプローチの利点の 1 つは、このメソッドがBean
クラスの他のインスタンス変数にアクセスできることですが、欠点として移植性が低くなります。
もう 1 つの方法は、別のクラスにValidatorインターフェイスを実装させることです。例:
@FacesValidator("customValidator")
public class MyValidator implements javax.faces.validator.Validator {
@Override
public void validate(FacesContext fc, UIComponent uic, Object o) {
//Same logic as bean validator method
}
}
次に、<h:inputText>
<f:validator validatorId="customValidator" />
あなたの問題は、JSF ライフサイクルの理解が不足していることを示しているようです。この概念をできるだけ理解するために時間を割くことを強くお勧めします。一度では理解できないかもしれませんが、JSF に深く関わるにつれて、いくつかの側面がより明確になります。ここから始めるのが良いでしょう。
JSF ライフサイクルをデバッグする