2016-12-07 17 views
1

MultipartFileが画像であることを検証する注釈を付けたいと思います。 @interfaceConstraintValidatorを作成し、自分のフィールドにアノテーションを追加しました。Spring Boot - フォーム上のカスタム検証アノテーションが動作しない

@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; 
} 

はここでフォームがコントローラ

方法を提出していますValidatorは@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を削除しました。

関連する問題