如何为spring自定义验证器配置messagecodesresolver

ldioqlga  于 2021-07-04  发布在  Java
关注(0)|答案(0)|浏览(220)

我尝试对可以用表示的数据对象进行验证 json 下一步:

{
  "id": "string",
  "mail": "mail@ukr.net",
  "map": {
    "additionalProp1": "string",
    "additionalProp2": "string",
    "additionalProp3": "string"
  },
  "name": "string",
  "secondLevel": {
    "id": "string",
    "mail": "mail2@ukr.net",
    "phone": "string"
  }
}
``` `org.springframework.boot:spring-boot-starter-validation` 为我提供了很多现成的解决方案。为我应用的特定消息进行一些配置 `messages.properties` 并补充道

@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}

@Bean
public LocalValidatorFactoryBean validator(MessageSource messageSource) {
    LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
    bean.setValidationMessageSource(messageSource);
    return bean;
}
此解决方案适用于扩展jsr-303的spring注解。所以消息从属性文件加载并由代码检测。
下一步是用 `map` 字段验证(它可以有不同的属性。根据标识符的不同,规则也可能不同。非常普遍 `validator` 因此:

import org.springframework.validation.Validator;

@Component
public class FirstLevelValidator implements Validator {

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

@Override
public void validate(Object target, Errors errors) {
    FirstLevel first = (FirstLevel) target;
    @NotNull Map<String, String> map = first.getMap();
    if (map != null) {
        if (!map.containsKey("key1")) {
            errors.rejectValue("map", "mandatory.parameter", "\"key1\" field is required.");
        }
        if (!map.containsKey("key2")) {
            errors.rejectValue("map", "{mandatory.parameter2}");
        }
    }
}

}

如果在中注册了自定义验证器,则该验证器可以工作 `WebDataBinder` . 要通过代码加载工作消息,我需要配置 `MessageCodesResolver` 对于 `binder` .

### 问题是:

如何配置 `MessageCodesResolver` 为了我的剧本?可以分享吗 `messageSource` 对于分解器。。。最后一步应该是 `binder.setMessageCodesResolver(messageCodesResolver)` 希望如此。

### p、 s。 `mandatory.parameter` 以及 `mandatory.parameter2` 位于 `messages.properties` 文件:

mandatory.parameter=Required.
mandatory.parameter2=Required2.

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题