2014-08-31 4 views
0

Spring 유효성 검사를 사용할 때 기본 ConstraintValidator 메시지를 무시하는 데 문제가 있습니다.Spring MVC에서 ConstraintValidator 기본 메시지를 재정의 할 수 없습니다.

NotNull=This field is mandatory 
BankHoliday=You cannot select a bank holiday 

BankHoliday에 대한 나의 주석이 다음과 같다 :

@Documented 
@Constraint(validatedBy = BankHolidayValidator.class) 
@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface BankHoliday { 

    String message() default "{BankHoliday}"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 
} 

내 검증은 다음과 같다 :

public class BankHolidayValidator implements ConstraintValidator<BankHoliday, Date> { 

@Override 
public void initialize(BankHoliday bankHoliday) { } 

@Override 
public boolean isValid(Date date, ConstraintValidatorContext cxt) { 

    if(date == null) { 
     cxt.disableDefaultConstraintViolation(); 
     cxt.buildConstraintViolationWithTemplate("{NotNull}").addConstraintViolation(); 
     return false; 
    } else if (isBankHoliday(date)) { 
     return false; 
    } else { 
     return true; 
    } 
} 

나는 다음과 같은 값을 포함하는 사용자 정의 messages.properties 파일이

}

내 모델은 @BankHoliday 주석과 주석이 : 사용자가이 필드를 채울하지 않는 경우

@RequestMapping(value="/new/request", method = RequestMethod.POST) 
public String putNewRequest(@Valid @ModelAttribute("request") Request request, BindingResult bindingResult, Map<String, Object> map) { 

    if (bindingResult.hasErrors()) { 

     // return them back 

    } else { 

     // process the request 
    } 
} 

그러나, 그들은 표시되는 오류 메시지가 당신이 ": 같은

@BankHoliday 
@DateTimeFormat(pattern = "dd/MM/yy") 
private Date desiredBookingDate; 

내 컨트롤러가 보인다 "이 필드는 필수 항목"대신 "은행 휴무일을 선택할 수 없습니다." 코드를 살펴보면 cxt.disableDefaultConstraintViolation() 줄이 확실히 호출되고 {NotNull} 제약 조건 유효성 검사가 추가되는 것을 볼 수 있지만 사용자는 항상 기본 메시지를 보게됩니다.

"{NotNull}"을 (를) "테스트 메시지"로 바꾸려고 시도했지만이 방법도 작동하지 않습니다. 왜 이것이 작동하지 않는지에 대해 올바른 방향으로 나를 가리킬 수 있습니까?

+1

순수 Bean 유효성 검사를 사용하여 예제를 사용해 보셨습니까? 기본적으로 Validator 인스턴스를 만들고 서로 다른 메시지를 반환해야하는 두 개의 인스턴스를 확인합니다. 나는 기본적으로 문제가 Bean Validation (aka Hibernate Validator)에서 발생하는지 아니면 Spring 통합 (아마도 메시지는 캐시 된 것인가?)에서 발생하는지 궁금합니다. 즉, http://stackoverflow.com/a/25596487/115835에 동의합니다. 동적으로 메시지를 변경하는 대신 제약 조건 구성을 사용하는 것이 Bean Validation의 정신에서 더 중요합니다. http://goo.gl/pLg8Hi – Hardy

+0

제약 조건을 살펴 보았습니다. 포인터에 대한 감사가 훨씬 적합합니다. –

답변

0

나는 내 자신의 코드를 살펴본 결과 (작동되는) 단 하나의 차이점은 addNode() 메소드를 호출하지 않았다, 그래서 나는 그것을 호출하는 것이 좋습니다 :

cxt.disableDefaultConstraintViolation(); 
cxt.buildConstraintViolationWithTemplate("{NotNull}") 
    .addNode("desiredBookingDate") 
    .addConstraintViolation(); 

하지만, 이럴 경우 잘못된 방향으로 가고 있습니다 : 유효성 검사기는 한 가지 유효성 검사 유형에 대해서만 책임을 져야합니다. 필드를 필수로 표시하려면 대신 @NotNull 주석을 사용하는 것이 좋습니다. 아마도 빈 문자열은 항상 그러한 제약을 통과하게 될 것입니다. 그리고이를 해결하기 위해, 과 emptyAsNull = true 매개 변수를 사용하여 유효성 검사 전에 빈 문자열을 null 값으로 사용해야합니다.

+0

답장을 보내 주셔서 감사합니다 .Could.BildConstraintViolationWithTemplate ("{NotNull}"). addNode ("desiredBookingDate"). addConstraintViolation();'이제 JSR-303에서 유효성을 검사 한 속성 'desiredBookingDate. desiredBookingDate'가 발생합니다. 스프링 데이터 바인딩을위한 대응 액세서가 없습니다 ". 또한,'addNode()'는 더 이상 사용되지 않으므로 대체 애플릿'addPropertyNode()'를 시도했지만 같은 오류로 실패했습니다. –

+0

그것은 또 다른 오류이며 desiredBookingDate 속성을 가진 객체는 해당 setter ('void setDesiredBookingDate (Date)')를 가지고 있지 않다는 것을 의미합니다. –