2012-03-14 2 views
0

JSR-303에서 유효성 검사 중에 값을 변경할 수있는 방법이 있습니까?유효성 검사 중 값을 변경하는 JSR-303 Bean 유효성 검사

public class MyEntity { 

    public String getName() { 
     return name; 
    } 

    // is it true that JSF/JAXB/JPA will always use this setter method? 
    public void setName(final String name) { 
     if (name == null) { 
      throw new NullPointerException("null name"); 
     } 
     final String collapsed = new CollapsedStringAdapter().unmarshal(name); 
     if (collapsed.length() < NAME_SIZE_MIN) { 
      throw new IllegalArgumentException("too short"); 
     } 
     if (collapsed.length() > NAME_SIZE_MAX) { 
      throw new IllegalArgumentException("too long"); 
     } 
     this.name = collapsed; 
    } 

    @NotNull 
    @Size(min = 1, max = 40) 
    @CollapsedStringSize(min = 1, max = 40) // xs:token 
    private String name; 

    @NotNull 
    @Size(min = 0, max = 255) 
    @NormalizedStringSize(min = 0, max = 255) // xs:normalizedString 
    private String description; 
} 

말, 나는 사용자 정의 유효성 검사기 뭔가 검증/발리의 유효성을 전이나하면서 값을 변경할 수있는 방법이 있나요

@Constraint(validatedBy = CollapsedStringSizeValidator.class) 
public @interface CollapsedStringSize { 
    int min() default 0; 
    int max() default Integer.MAX_VALUE; 
} 

public class CollapsedStringSizeValidator 
    implements ConstraintValidator<CollapsedStringSize, String> { 

    @Override 
    public boolean isValid(String object, 
          ConstraintValidatorContext constraintContext) { 

     if (object == null) { 
      return true; 
     } 

     final String collapsed = new CollapsedStringAdapter().unmarshal(object); 

     // how can I get the min/mix anyway? 

     return collapsed.length() >= min && collapsed.length() <= max; 
    } 
} 

처럼 보이게하는거야?
세터와 붙어 있어야합니까? 당신의 예에서

+0

왜 엔진의 유효성을 검사하는 동안 값을 변경하겠습니까? 사례에 대한 자세한 정보를 설명해 주시겠습니까? –

+0

사실 내 원래의 관심사는 XML로 정렬하기 전이나 DB에 유지하기 전에 유효한 양식 (접힌/정규화 된)으로 값을 유지하는 것입니다. –

+1

글쎄, 입력 데이터의 "유효한 형식"을 자동으로 알아낼 수 있다면 데이터가 데이터베이스에 저장되기 전에 setter를 사용하는 것이 가능합니다. 유효성 확인 프레임 워크의 주요 용도는 비즈니스 논리 코드를 복잡하게하지 않고 자동으로 수정할 수없는 데이터의 유효성을 검사하는 것입니다. 또한 유효성 검사 프레임 워크를 사용하면 테스트 할 수있는 장치에 유효성 검사 논리를 작성할 수 있습니다. –

답변

1

setName()은 다음과 같아야합니다

public void setName(final String name) { 
    if (name == null) { 
     this.name = null; 
     return; 
    } 
    this.name = new CollapsedStringAdapter().unmarshal(name); 
} 

가 수정 위와 같이, 당신은 더 이상 @CollapsedStringSize를 사용할 필요가 없습니다. @Size은 유효성 검사에 충분합니다.

JPA에서 JPA 엔진이 엔티티 개체에 데이터를로드 한 후에 데이터를 처리하려는 경우 @PostLoad을 시도 할 수 있습니다.

+0

네 말이 맞아. '@ NotNull '도 있기 때문에'null' 체크가 필요하지 않습니다. JPA/JSF가 리플렉션이나 기존의 setter 메소드없이 필드에서 DB/Facelet의 값을 직접 설정할 수 있습니까? 그래서 나는 setter 외에'@ PostLoad'를 고려해야합니까? –

+0

JSF에 익숙하지 않습니다. JPA의 경우 자세한 내용은 [이 질문] (http://stackoverflow.com/questions/3976469/is-hibernate-jpa-taking-in-consideration-the-transiant-modifier-not-the-anno)을 확인하십시오. –

관련 문제