使用Spring的Validator接口的Custom Bean Validator

时间:2017-12-23 11:54:55

标签: java validation spring-mvc spring-boot bean-validation

我正在尝试编写自定义bean验证程序,并根据用户界面上的区域设置显示验证消息。

为此,我创建了一个如下的验证器:

@Component
public class MyCustomValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return MyClass.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        MyClass myObject = (MyClass)target;

        if (StringUtils.isBlank(myObject.getName())) {          
            errors.rejectValue("name", "{myproject.myclass.validation.name});
        }
    }

}

我还注册了messageSource和validator bean:

@Configuration
@ComponentScan(basePackages = "com.mycompany.myproject")
public class MyProjectWebMvcConfig {

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();

        messageSource.addBasenames("locale/myproject");

        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

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

在我的控制器中,我使用initBinder来注册我的验证器:

@RestController
@RequestMapping("/api/mytype")
public class MyController extends MyBaseController {

    @Autowired
    private MyCustomValidator myCustomValidator;

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        super.initBinder(binder);
        binder.addValidators(this.myCustomValidator);
    }

    @PostMapping(value = "/")
    public ResponseEntity<OperationResult<Void>> save(@Valid @RequestBody MyClass myObject, BindingResult bindingResult, HttpServletRequest request) {
        if (!bindingResult.hasErrors()) {
            ...
        }
        ...
    }
}

public class MyBaseController {

    @Autowired
    protected Validator validator;

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(validator);
    }
}

仍然,验证错误消息在用户界面上显示为{myproject.myclass.validation.name}。即使我已设置LocalValidatorFactoryBean的验证消息源,似乎也无法从messageSource读取消息。

另一方面,如果我使用@NotNull(message = {myproject.myclass.validation.name})注释而不是使用自定义验证器,则验证错误消息会正确显示。

无法弄清楚我错过了什么。

2 个答案:

答案 0 :(得分:0)

试试这个

  errors.rejectValue("name", "myproject.myclass.validation.name");

答案 1 :(得分:0)

检查messageSource文件的编码。它应该是utf-8。