2016-12-07 2 views
1

Я хотел бы получить аннотацию, подтверждающую, что изображение MultipartFile - это изображение. Я создал @interface и ConstraintValidator, и добавил аннотацию в мое поле.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; 
} 

Вот форма представить метод в контроллере

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

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

Validator установлен в файле @Configuration см 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

К сожалению, я попал в submit слишком рано. В ближайшее время я добавлю дополнительную информацию. – 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 
     } 
    ... 
    } 
} 

Я также удалил Bean MethodValidationPostProcessor в @Configuration классе.

Смежные вопросы