2017-11-14 4 views
1

커스텀 어노테이션을 추가했는데 PersonForm의리스트 입력을 검증하기 위해 컨 스트레인 트 검사기를 사용했습니다.하지만 예외 테스트를 할 때는 데이터 바인딩을 처리합니다. 내 요청이 던졌습니다. 아약스 전화 + form.serialize();spring mvc의 콜렉션 유형 레벨에서 커스터마이징 주석을 사용하는 방법

PersonForm :

private Long id; 

@NotEmpty 
private String firstName; 

@NotEmpty 
private String lastName; 

@Email(message = "profile.email.email") 
private String email; 

private List<@ResourceConstraint String> resource; 

// all setters/getters .... 

주석

@Documented 
@Constraint(validatedBy = ResourceValidator.class) 
@Target({ElementType.TYPE_USE}) 
@Retention(RetentionPolicy.RUNTIME) 
@NotEmpty 
public @interface ResourceConstraint { 

    String message() default "resource not Valid"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 

제약 검증

public class ResourceValidator implements ConstraintValidator<ResourceConstraint, String> { 

    @Override 
    public boolean isValid(String value, ConstraintValidatorContext context) { 
     boolean result = false; 
      if(Enums.getIfPresent(Resource.class, value.toUpperCase()).isPresent()) { 
        result = true; 
      } 
     return result; 
    } 

} 

컨트롤러

@PostMapping(path = "/applay/profile/{id}", produces = "application/json;charset=UTF-8") 
public @ResponseBody JsonResponseBean applayProfile(@PathVariable Long id, @Valid PersonForm form, BindingResult result, Locale locale) throws BusinessException { 
    JsonResponseBean jsonResponse = new JsonResponseBean(); 
    Person current = new Person(); 

    if (!result.hasErrors()) { 
     ... 

    } else { 
     ... 
    } 

    return jsonResponse; 
} 

예외 바로 내가 제약을

종속성을 적용하기보다 일이 더 필요하지 않습니다 모든 세터와 PersonForm의 게터가 hibernate doc에 따라 를 구현하는 사용자 정의 유효성 검사기 프로세스를 결합하는 방법을

java.lang.IllegalStateException: JSR-303 validated property 'resource[1].<list element>' does not have a corresponding accessor for Spring data binding - check your DataBinder's configuration (bean property versus direct field access) 
    at org.springframework.validation.beanvalidation.SpringValidatorAdapter.processConstraintViolations(SpringValidatorAdapter.java:162) 
    at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:117) 
    at org.springframework.validation.DataBinder.validate(DataBinder.java:891) 
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.validateIfApplicable(ModelAttributeMethodProcessor.java:168) 
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:115) 
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) 

Caused by: org.springframework.beans.NotReadablePropertyException: Invalid property 'resource[1].<list element>' of bean class [com.domain.project.forms.PersonForm]: Bean property 'resource[1].<list element>' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter? 
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:633) 
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:624) 
    at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99) 
    at org.springframework.validation.AbstractBindingResult.getRawFieldValue(AbstractBindingResult.java:283) 
    at org.springframework.validation.beanvalidation.SpringValidatorAdapter.getRejectedValue(SpringValidatorAdapter.java:268) 
    at org.springframework.validation.beanvalidation.SpringValidatorAdapter.processConstraintViolations(SpringValidatorAdapter.java:148) 
    ... 40 common frames omitted 

(Gradle을)

compile group: 'javax.validation', name: 'validation-api', version: '2.0.0.Final' 
    compile group: 'org.hibernate.validator', name: 'hibernate-validator', version: '6.0.2.Final' 
... 
+0

[여기] (https://jira.spring.io/browse/SPR-15936) 및 [여기도] (https://jira.spring.io/browse/) SPR-15916)에서 문제가 해결되었음을 알려드립니다 (이 단계에서 나에게 새로운 것이 었습니다) – alveomaster

답변

0

내가 그것을 가지고,

로 업그레이드 오류와 함께 없애
spring Version  = '5.0.1.RELEASE' 
hibernate Version = '5.2.12.Final' 

with 
compile group: 'javax.validation', name: 'validation-api', version: '2.0.0.Final' 
compile group: 'org.hibernate.validator', name: 'hibernate-validator', version: '6.0.4.Final'