当前位置: 首页 > 知识库问答 >
问题:

使用Spring的验证器接口的自定义Bean验证器

邵逸明
2023-03-14

我正在尝试编写一个自定义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(消息={myproject.myclass.validation.name})注释而不是使用自定义验证器,则验证错误消息会正确显示。

不知道我错过了什么。

共有2个答案

辛盛
2023-03-14

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

漆雕皓轩
2023-03-14

试试这个

  errors.rejectValue("name", "myproject.myclass.validation.name");
 类似资料:
  • 5.2 使用Spring的验证器接口进行验证 {#toc_2} Spring具有一个Validator接口可以让你用于验证对象。Validator接口在工作时需要使用一个Errors对象,以便于在验证过程中,验证器可以将验证失败的信息报告给这个Errors对象。 让我们考虑一个小的数据对象: public class Person { private String name; p

  • 我试图使用注释和ConstraintValidator接口创建自定义bean验证。目的是使模型的名称独一无二。我不知道为什么,但是当我提交表单以便添加产品时,会抛出NullPointerException。 我的root-context.xml文件:

  • 首先,我是Vaadin7的新手。当我发现BeanFieldGroup.class时,我正在尝试一些vaadin演示。正如我所看到的,这个类将一个字段绑定到一个bean属性。在bean中,使用验证约束注释对属性进行注释(JSR303)。在本例中,我的pom.xml包含hibernate验证器依赖项: 我创建了validationmessage.properties文件,并在其中放了一些消息(带有匈牙

  • 任何进入CustomValidator实现的bean都始终为空。我使用的是Spring Boot 2,应用程序是REST API,我没有使用MVC。 我已经尝试了所有我读到的关于这件事的东西,但到目前为止运气都不好。 例如,这里的这个话题对我来说并不适用 否则我应该验证吗?,我已经坚持了2天了。 这是我的配置类: 我的CustomValidator如下所示: JPA实体: 注释:

  • 我试图用Hibernate Validation 6.0.1定义约束定义,其中验证器位于相对于约束注释的不同位置(.jar/项目)。Aka,我有我想要验证的对象,它们位于带有注释定义的项目“api”中,但我将在项目“modules/common”中有验证器 我遵循文档中的描述。 配置文件 约束注释 验证器 我的问题我的问题是,如果我没有将“@约束(validatedby={})”放在注释中,我会得

  • 那里是自定义验证器: 当我调用时,我在插入的的上得到了一个。 我假设Spring会正确地注入定制验证器,我必须告诉他。但是,我不知道怎么做。我已经尝试了一些通过堆栈溢出和谷歌找到的东西,但没有运气。 任何帮助都将不胜感激。