【问题标题】:Custom Bean Validator using Spring's Validator interface使用 Spring 的 Validator 接口自定义 Bean Validator
【发布时间】:2017-12-23 11:54:55
【问题描述】:

我正在尝试编写自定义 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 和验证器 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}) 注释而不是使用自定义验证器,验证错误消息会正确显示。

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

【问题讨论】:

  • 我遇到了同样的问题,请问您是如何解决的?

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


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      相关资源
      最近更新 更多