2012-02-27 3 views
3

프로세스 검증 단계에서 실패 할 경우에도 구성 요소를 업데이트하는 방법이 있나요 내 요구 사항입니다, 값이 비어 있다면, 그래서JSF 내가 좋아하는 <code>required=true</code> 속성이 입력 텍스트를 가지고

<h:panelGrid columns=2> 
    <h:panelGroup id="ccm"> 
     <p:inputText id="txtCCMNumber" value="#{setupView.selectedCCM}" 
       required="true" requiredMessage="Required"> 
      <p:ajax event="blur" listener="#{setupView.handleLooseFocusCCMTextbox()}" 
       update=":setupForm:ccm :setupForm:ccmMsg"/> 
     </p:inputText> 
     <h:outputText value="Duplicated" id="ccmExisted" 
       styleClass="ui-message-error ui-widget ui-corner-all" 
       rendered="#{setupView.ccmNameExisted}"/> 
     <h:graphicImage id="ccmNotExist" url="resources/images/check-icon.png" 
        rendered="#{setupView.ccmNameUnique}" 
        width="18"/> 
    </h:panelGroup> 
    <p:message for="txtCCMNumber" id="ccmMsg" display="text"/> 
</h:panelGrid> 

아래에 required=true부터 Required이 표시되면 프로세스 유효성 검사 단계에서 오류가 발생합니다. 값이 고유 한 경우 check 이미지를 표시하고 복제 된 경우 Duplicated 텍스트를 표시하십시오. 내가 겪는 문제는 뭔가를 입력하고 탭을 치면 (고유 한 텍스트를 입력한다고 가정), check 이미지를 표시 한 다음 텍스트를 지우고 탭을 다시 열면 현재는 Required 텍스트가 나타납니다. check 이미지. 내 이론은 Process validation 단계에서 값이 비어있어 실패합니다. 따라서 업데이트 구성 요소 단계에서 부울 ccmNameUniquefalse으로 설정하는 handleLooseFocusCCMTextbox() 메서드를 호출하지 않습니다. 이 문제를 해결할 수있는 방법이 있습니까?

참고 : handleLooseFocusCCMTextbox()는 단지 check 이미지 또는 Duplicated 텍스트를 표시하기 위해 오프에서 부울 값을 켭니다.

답변 됨. Validator 클래스 생성, 필수 = 꺼내기

public void validate(FacesContext fc, UIComponent uic, Object value) 
     throws ValidatorException { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    SetupView setupView = (SetupView) context.getApplication(). 
      evaluateExpressionGet(context, "#{setupView}", SetupView.class); 
    if (value == null || value.toString().isEmpty()) { 
     setupView.setCcmNameUnique(false); 
     FacesMessage message = new FacesMessage(); 
     message.setSeverity(FacesMessage.SEVERITY_ERROR); 
     message.setSummary("Error"); 
     message.setDetail("Required"); 
     //This will end up in <p:message> 
     throw new ValidatorException(message); 
    } 
    String rootPath = setupView.getRootPath(); 
    File rootFolder = new File(rootPath); 
    if (rootFolder.exists() && rootFolder.canRead()) { 
     List<String> folderNames = Arrays.asList(new File(rootPath).list()); 
     if (folderNames.contains(value.toString())) { 
      setupView.setCcmNameUnique(false); 
      FacesMessage message = new FacesMessage(); 
      message.setSeverity(FacesMessage.SEVERITY_ERROR); 
      message.setSummary("Error"); 
      message.setDetail("Duplicate"); 
      //This will end up in <p:message> 
      throw new ValidatorException(message); 
     } else { 
      setupView.setCcmNameUnique(true); 
     } 
    } else { 
     logger.log(Level.SEVERE, "Please check the root folder path as " 
       + "we cannot seems to see it. The path is {0}", rootPath); 
    } 
} 

답변

2

동작 수신기 대신 유효성 검사기를 사용하고 싶습니다.

public void validateDuplicateCCM(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
    if (value == null || value.toString().isEmpty()) { 
     return; // Let required="true" handle. 
    } 

    // ... 

    if (duplicate) { 
     ((UIInput) component).setValid(false); 
     ccmNameExisted = true; 
     // I'd rather throw ValidatorException instead of above two lines here so that it ends up in <p:message> 
    } else { 
     ccmNameUnique = true; 
    } 
} 
+0

<p:inputText id="txtCCMNumber" value="#{setupView.selectedCCM}" required="true" requiredMessage="Required" validator="#{setupView.validateDuplicateCCM}"> <p:ajax event="blur" update="ccm ccmMsg" /> </p:inputText> 

나는'()'새로운 ValidatorException을 던져에 대한 귀하의 제안을 사랑 해요. 그러나, 나는 여전히 같은 문제가 있습니다. 만약 내가 아무 것도 입력하지 않고 Tab을 치면'validateDuplicateCCM'을 호출하지 않는다. 따라서 고유 한 것을 입력하고 탭을 긋고 진드기 마크가 나타나면 입력 한 내용을 지우고 Tab을 사용하여'Required' 메시지가 나타나지만'validateDuplicateCCM'가 수행했기 때문에 여전히 틱 마크가 나타납니다. 호출되지 않습니다. 어떤 아이디어 BalusC? h : inputText로 전환하면 같은 동작을 보입니다. –

+0

아, 당신은'validator' 속성의 버그를 발견했습니다. 관련 질문/답변보기 : http://stackoverflow.com/questions/9415059/validating-empty-fields-with-inline-validation-method-and-validator-class 값이 null 일 때 실제로 호출되지 않습니다. 나는 당신이''에 의해 선언 한 일반적인'Validator' 클래스로 그것을 옮길 것입니다. – BalusC

+0

그러나 중복이 발견되지 않으면'ccmNameUnique = true; '를 설정해야합니다. 'ccmNameUnique'는 내 뷰 범위의 관리 Bean 'SetupView'에있는 변수입니다. 관리 빈을 밸리데이터 BalusC에 삽입 할 수 있습니까? –

관련 문제