2012-05-28 3 views
3

UIInput#getValue()을 통해 이전 값을 얻을 수 있다는 것을 알고 있습니다.값이 변경되면 Validator를 체크인하는 방법은 무엇입니까?

그러나 필드가 빈 값에 바인딩되는 많은 경우에 입력 값이 기본값과 같으면 유효성을 검사하지 않아도되는 기본값을 얻고 싶습니다.

특정 필드에 고유 제한 조건이 있고 편집 양식이있는 경우 매우 유용합니다.
check 제약 조건 메서드에서는 항상 자체 값을 찾아 false로 확인되므로 유효성 검사는 항상 실패합니다.

한 가지 방법은 <f:attribute>을 사용하여 속성으로 해당 기본값을 전달하고 유효성 검사기 내부를 확인하는 것입니다. 그러나 더 쉬운 내장 방법이 있습니까?

+0

가능한 [JSF/ADF 유효성 검사기에서 오래된 값을 얻는 방법] (http://stackoverflow.com/questions/2413424/how-to-get-old-value-from-jsf-adf-validator) – djmj

답변

10

제출 된 값은 validate() 구현에서 value 인수로 제공됩니다.

public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
    Object oldValue = ((UIInput) component).getValue(); 

    if (value != null ? value.equals(oldValue) : oldValue == null) { 
     // Value has not changed. 
     return; 
    } 

    // Continue validation here. 
} 

대안은 ValueChangeListenerValidator을 설계하는 것이다. 값이 실제로 변경된 경우에만 호출됩니다. 그것은 다소 해킹이지만, 당신이 정말로 필요로하는 일을합니다. 수동으로 추가 수동으로 무효하고 구성 요소를 모두 설정하고 상황에 직면해야하는 이유 당신이 거기 ValidatorException을 던질 수 없습니다

<h:inputText ... valueChangeListener="#{uniqueValueValidator}" /> 

또는

@ManagedBean 
public class UniqueValueValidator implements ValueChangeListener { 

    @Override 
    public void processValueChange(ValueChangeEvent event) throws AbortProcessingException { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     UIInput input = (UIInput) event.getComponent(); 
     Object oldValue = event.getOldValue(); 
     Object newValue = event.getNewValue(); 

     // Validate newValue here against DB or something. 
     // ... 

     if (invalid) { 
      input.setValid(false); 
      context.validationFailed(); 
      context.addMessage(input.getClientId(context), 
       new FacesMessage(FacesMessage.SEVERITY_ERROR, "Please enter unique value", null)); 
     } 
    } 

} 

주와

<h:inputText ...> 
    <f:valueChangeListener binding="#{uniqueValueValidator}" /> 
</h:inputText> 

, 즉 년대 구성 요소에 대한 메시지 context.validationFailed()은 JSF가 업데이트 모델 값을 건너 뛰고 액션 단계를 호출하도록합니다.

+0

하하, getValue() 접근법을 추가하는 동안 나는 또한 그것을 테스트하여 그것을 적어두고 싶다. ^^. 이 솔루션은 훨씬 좋습니다. – djmj

+0

가끔은 일들이 너무 분명해서 잠시 보지 못합니다.) – BalusC

+0

내 질문에 답을 얻었습니까? getValue는 항상 이전 값을 가져올 것이라고 생각했습니다. 시간을 낭비해서 죄송합니다. – djmj

관련 문제