프로세스 검증 단계에서 실패 할 경우에도 구성 요소를 업데이트하는 방법이 있나요 내 요구 사항입니다, 값이 비어 있다면, 그래서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
단계에서 값이 비어있어 실패합니다. 따라서 업데이트 구성 요소 단계에서 부울 ccmNameUnique
을 false
으로 설정하는 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);
}
}
와
나는'()'새로운 ValidatorException을 던져에 대한 귀하의 제안을 사랑 해요. 그러나, 나는 여전히 같은 문제가 있습니다. 만약 내가 아무 것도 입력하지 않고 Tab을 치면'validateDuplicateCCM'을 호출하지 않는다. 따라서 고유 한 것을 입력하고 탭을 긋고 진드기 마크가 나타나면 입력 한 내용을 지우고 Tab을 사용하여'Required' 메시지가 나타나지만'validateDuplicateCCM'가 수행했기 때문에 여전히 틱 마크가 나타납니다. 호출되지 않습니다. 어떤 아이디어 BalusC? h : inputText로 전환하면 같은 동작을 보입니다. –
아, 당신은'validator' 속성의 버그를 발견했습니다. 관련 질문/답변보기 : http://stackoverflow.com/questions/9415059/validating-empty-fields-with-inline-validation-method-and-validator-class 값이 null 일 때 실제로 호출되지 않습니다. 나는 당신이''에 의해 선언 한 일반적인'Validator' 클래스로 그것을 옮길 것입니다. –
BalusC
그러나 중복이 발견되지 않으면'ccmNameUnique = true; '를 설정해야합니다. 'ccmNameUnique'는 내 뷰 범위의 관리 Bean 'SetupView'에있는 변수입니다. 관리 빈을 밸리데이터 BalusC에 삽입 할 수 있습니까? –