2012-12-24 3 views
2

Beam Validation with JSF2.0을 사용하고 있습니다. 몇 가지 조건에 따라 지정하고 관리 빈의 속성에 링크하는 유효성 검사 그룹이 있습니다. 속성은 페이지가 처음로드되어 올바르게 작동 할 때 (즉, 양식이 제출되면 올바른 그룹이 확인 됨) 할당됩니다. 그러나이 속성을 변경하면 유효성 검사 그룹이 업데이트되지 않고 원래 값이 설정된 값이 사용됩니다. 예를 들어JSF f : validateBean validationGroups가 업데이트되지 않습니다.

: JSF 조각 :

<h:selectOneMenu id="unitOfMerchandise" value="#itemManager[targetBean].unitOfMerchandise}"> 
    <f:selectItem itemLabel="-- select --" itemValue="" /> 
    <f:selectItems value="#{itemManager.unitsOfMerchandise}" /> 
    <f:validateBean validationGroups="#{itemManager.validatorClass}" /> 
</h:selectOneMenu> 

방법 :

@ManagedBean 
@ViewScoped 
public class ItemManager implements Serializable { 
private String validatorClass = "com.rcs.itemmngr.model.validation.RegularItem" 
private OpenItemRequest openItemRequest 


private void onItemTypeSelected() { 

     validatorClass = itemManagerModel.getValidatorItemRequestClass(openItemRequest).getName(); 

} 
///getters setters 
} 

이 작업을하는 방법에 어떤 아이디어? 또한 관리 빈에서 프로그래밍 방식으로 유효성 검사 그룹을 변경하는 방법을 찾지 만 기쁨은 없습니다.

답변

0

f : validateBean gruops는 구성 요소 트리가 빌드 될 때 한 번 평가됩니다. 그들을 업데이트하는 간단한 방법이없는 것 같습니다.

//bind you component here 
EditableValueHolder input;  

//call this to update groups   
public void setValidationGroups(String validationGroups) { 
    for (Validator validator : input.getValidators()) { 
     if (!(validator instanceof BeanValidator)) { 
      continue; 
     } 
     BeanValidator beanValidator = (BeanValidator) validator; 
     beanValidator.setValidationGroups(validationGroups); 
    } 
} 
  • 또는이 문서에서 설명하는 방법 사용할 수 있습니다 :

    • 당신은 구성 요소에 따라 수동으로 업데이트 할 수 있습니다 Delete the components holding unwanted state

      아이디어는 F와 구성 요소를 제거하는 것입니다 : validateBean를 트리에서이므로 새 그룹으로 렌더링하면 다시 초기화됩니다.

      parentComponent.getChildren().clear(); 
      

      예 : 당신은 실행하고 섹션을 렌더링하는 경우, 당신은 actionListner이 같은 somethig에 호출 할 수 있습니다 :

      public void resetContactsValidationGroups() { 
          FacesContext ctx = FacesContext.getCurrentInstance(); 
          Iterator<String> ids = ctx.getPartialViewContext().getExecuteIds().iterator(); 
          while (ids.hasNext()) { 
           ctx.getViewRoot().findComponent(ids.next()).getChildren().clear(); 
          } 
      } 
      
  • 관련 문제