2016-12-07 2 views
1

MultipartFile이 이미지인지 확인하는 특수 효과를 원합니다. @interfaceConstraintValidator을 생성하고 내 필드에 특수 효과를 추가했습니다.스프링 부트 - 양식의 사용자 정의 유효성 검사 주석이 작동하지 않습니다.

기타 유효성 검사 주석 (예 : @NotEmpty@Size(min = 0, max = 2))이 정상적으로 작동합니다.

다음은 요약 코드입니다. This question에도 같은 문제가 있지만 답변이 나에게 도움이되지 않습니다. Form.java

:

@Validated 
public class Form { 

    @MultipartImage 
    private MultipartFile image; 

    ... 
} 

@interface MultipartImage

import static java.lang.annotation.ElementType.FIELD; 
import static java.lang.annotation.ElementType.LOCAL_VARIABLE; 
import static java.lang.annotation.ElementType.METHOD; 

import java.lang.annotation.Documented; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import javax.validation.Constraint; 
import javax.validation.Payload; 

import validation.MultipartFileImageConstraintValidator; 

@Documented 
@Constraint(validatedBy = { MultipartFileImageConstraintValidator.class }) 
@Target({ LOCAL_VARIABLE, FIELD, METHOD }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface MultipartImage { 

    String message() default "{MultipartImage.message}"; 

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

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

} 

유효성 검사기, MultipartFileConstraintValidator.java

import java.io.IOException; 

import javax.validation.ConstraintValidator; 
import javax.validation.ConstraintValidatorContext; 

import org.springframework.web.multipart.MultipartFile; 

public class MultipartFileConstraintValidator implements ConstraintValidator<MultipartImage, MultipartFile> { 


@Override 
public void initialize(final MultipartImage constraintAnnotation) { 
} 

@Override 
public boolean isValid(final MultipartFile file, final ConstraintValidatorContext context) { 
    return false; 
} 

여기 형 컨트롤러에있어서 제출있어

검사기는 @Configuration 파일에 설정
@RequestMapping(value = "/formsubmit", method = RequestMethod.POST) 
public ModelAndView handleForm(@Validated final Form form, 
     final BindingResult bindingResult) { 

    if (bindingResult.hasErrors()) { 
     ... 
     // returns the model 
    } 
} 

https://stackoverflow.com/a/21965098/4161471

@Configuration 
@ConfigurationProperties("static") 
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class) 
public class StaticResourceConfig extends WebMvcConfigurerAdapter { 

... 

@Bean(name = "validator") 
public LocalValidatorFactoryBean validator() { 
    LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean(); 
    bean.setValidationMessageSource(messageSource()); 
    return bean; 
} 

@Bean 
public MethodValidationPostProcessor methodValidationPostProcessor() { 
    final MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor(); 
    methodValidationPostProcessor.setValidator(validator()); 

    return methodValidationPostProcessor; 
} 

@Override 
public Validator getValidator() { 
    return validator(); 
} 

@Bean 
public ReloadableResourceBundleMessageSource messageSource() { 
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
    // Load files containing message keys. 
    // Order matters. The first files override later files. 
    messageSource.setBasenames(// 
      // load messages and ValidationMessages from a folder relative to the jar 
      "file:locale/messages", // 
      "file:locale/ValidationMessages", // 
      // load from within the jar 
      "classpath:locale/messages", // 
      "classpath:locale/ValidationMessages" // 
    ); 
    messageSource.getBasenameSet(); 
    messageSource.setCacheSeconds(10); // reload messages every 10 seconds 
    return messageSource; 
} 

}를 참조

+0

죄송합니다. 제출이 너무 일찍 발생했습니다. 곧 더 많은 정보를 추가하겠습니다. – aSemy

+0

MultipartFileConstraintValidator는 ConstraintValidator 을 구현해야합니다. '@ Size'와 같은 다른 제약이'Form' 클래스에 존재합니까? 아니면 다른 클래스에서 검증 했습니까? –

+0

@DanielOlszewski 그게 실수 야. 이제는 바로 잡았어. 다른 제약은 같은'Form' 클래스에서 작동합니다. – aSemy

답변

0

특별히 추가 검증이 정의와 결합 된 컨트롤러에 대한, 내 원래의 코드에서 누락 된 정보가 발생했습니다. 잘못된 메서드를 사용하여 유효성 검사기 FormValidator을 포함하고 주석 유효성 검사를 재정의합니다.

binder.setValidator(formValidator)은 다른 유효성 검사기를 대체합니다. 대신 binder.addValidators(formValidator)을 사용해야합니다!

@Controller 
public class FormController { 

    @Autowired 
    final private FormValidator formValidator; 

    @InitBinder("form") 
    protected void initBinder(WebDataBinder binder) { 
     // correct 
     binder.addValidators(formValidator); 
     // wrong 
     //binder.setValidator(formValidator); 
    } 

    ... 

    @RequestMapping(value = "/formsubmit", method = RequestMethod.POST) 
    public ModelAndView handleForm(@Validated final Form form, final BindingResult bindingResult) { 
     if (bindingResult.hasErrors()) { 
      ... 
      // returns the model 
     } 
    ... 
    } 
} 

나는 또한 @Configuration 클래스의 콩 MethodValidationPostProcessor을 제거했습니다.

관련 문제