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

使用JSR-303验证表单时使用I18n消息

宋俊民
2023-03-14

我的应用程序是完全配置的带有thymeleaf模板引擎的spring boot应用程序。I18n也进行了配置,以便我可以在模板中使用它。下面是我使用的配置:

spring.messages.basename=i18n/messages

虽然手动验证字段I18n也可以正常工作:

BindingResult result;
result.rejectValue("field", "some.i18n.code");

但是一旦我想实现一些自定义ConstraintValidator对象并使用消息字段-不涉及I18n,我就会收到纯代码作为响应而不是消息。即。

{some.i18n.code}

我尝试了这个解决方案——没有结果。这也是同样的结果。

我错过了什么?

共有2个答案

姬经义
2023-03-14

另一种解决方案是在您的任何@配置类中声明此bean:

@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean(MessageSource messageSource) {
    LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
    bean.setValidationMessageSource(messageSource);
    return bean;
}

由于声明了这一点,现在我的自定义验证器中的自定义错误代码正在我的<code>消息中搜索。properties(通过声明spring.messages.basename=i18n/messages,我在i18n子目录中也有)。

验证程序代码示例:

public class ContestValidator implements ConstraintValidator<ValidContest, CreateContestParameters> {

  @Override
  public void initialize(ValidContest constraintAnnotation) {

  }

  @Override
  public boolean isValid(CreateContestParameters contestParameters, ConstraintValidatorContext context) {
    boolean result = true;

    if (!endDateIsEqualOrAfterStartDate(contestParameters)) {
        context.buildConstraintViolationWithTemplate("{Contest.endDate.invalid}")
               .addPropertyNode("endDate").addConstraintViolation();
        result = false;
    }
    if (!registrationDeadlineIsBeforeStartDate(contestParameters)) {
        context.buildConstraintViolationWithTemplate("{Contest.registrationDeadline.invalid}")
               .addPropertyNode("registrationDeadline").addConstraintViolation();
    }
    return result;
  }
}
长孙和悦
2023-03-14

我想我找到了解决办法,也许对别人会有帮助。您只需将以下定义添加到< code > WebMvcConfigurerAdapter 配置实现中:

@Autowired
private MessageSource messageSource;

@Bean
public LocalValidatorFactoryBean validator() {
     LocalValidatorFactoryBean validatorFactoryBean = new LocalValidatorFactoryBean();
     validatorFactoryBean.setValidationMessageSource(messageSource);

     return validatorFactoryBean;
}

@Override
public Validator getValidator() {
     return validator();
}
 类似资料:
  • 在添加Spring特定的配置之前,没有进行任何验证,但也没有任何错误。可能根本没有尝试验证。 现在我已经添加了必要的@Validated类注释和bean定义: 我得到以下错误:

  • 我的bean中有两个字段 当字段key=“A”,“value”应该跟在其他“key”的特定Regex后面时,它可以是任何内容。 如何根据键定义此值验证。

  • 问题内容: Hibernate Validator 4.x中是否有跨域验证的实现(或第三方实现)?如果没有,实现跨域验证器的最干净方法是什么? 例如,如何使用API​​来验证两个bean属性是否相等(例如,验证密码字段与密码验证字段匹配)。 在注解中,我期望这样的东西: 问题答案: 每个字段约束都应由不同的验证者注释处理,换句话说,不建议对一个字段进行其他字段的验证注释检查。跨领域验证应在课程级别

  • 我按照文档(http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/validation.html)中给出的内容配置了JSR-303自定义验证器,在类路径上使用LocalValidatorFactoryBean和Hibernate验证器完成。但是,我的验证器只是拒绝启动。我在这里(https://github.

  • 我提出了一个使用JSR303组进行条件验证的概念。“有条件地”意味着我有一些字段,这些字段只有在另一个字段具有特定值时才相关。 示例:有一个选项可以选择是以个人身份注册还是以公司身份注册。选择公司时,用户必须填写包含公司名称的字段。 但是Spring由于数据绑定而打破了这个想法。在验证开始之前,Spring将数据绑定到RegisterForm。例如,如果类型不兼容(应为int值,但用户用字母填充表

  • 我正在用Spring和Thymeleaf填表: MyForm如下所示: 正如您所看到的,我做了一个自定义注释,它应该检查输入值是否可以解析为: 现在在我的Controller类中,我正在执行以下操作: 但是,当试图将放入文本字段以测试验证时,获取: 下面是我读到的示例,并希望用自定义验证器进行扩展:http://viralpatel.net/blogs/spring-mvc-hashmap-for