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

Spring 4&Hibernate 5验证器消息源不工作

阎璞瑜
2023-03-14

我无法使用Spring MVC 4.2.5版本来处理hibernate validation 5.1.0.Final。

我的WebConfig:

    @Bean
    public LocalValidatorFactoryBean validator() {
        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(messageSource());
        return validator;
    }
    @Bean
    @Autowired
    public MethodValidationPostProcessor getValidationPostProcessor(LocalValidatorFactoryBean validator) {
        MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
        processor.setValidator(validator);
        return processor;
    }

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("i18n/messages");
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setUseCodeAsDefaultMessage(true);
        return messageSource;
    }

    @Override
    public Validator getValidator() {
        return validator();
    }
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor(){
        LocaleChangeInterceptor l = new LocaleChangeInterceptor();
        l.setParamName("lang");
        return l;
    }

    @Bean
    public SessionLocaleResolver localeResolver(){
        SessionLocaleResolver s = new SessionLocaleResolver();
        s.setDefaultLocale(Locale.ENGLISH);
        return s;
    }

我有一个ExceptionHanlder,它获取验证消息,并将其作为JSON推回:

    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseBody
    public ValidationError handleConstraintViolation(final ConstraintViolationException exception) {
        ValidationError v = new ValidationError();

        exception.getConstraintViolations().forEach(violation -> {
                v.addError(violation.getPropertyPath().toString(), violation.getMessage());
        });
        logger.warn(exception, exception);
        return v;
    }
    @Column(name = "VALUE_", nullable = false)
    @Email(message = "{Email.contractorContactEmail.value}")
    @NotNull(message = "{NotNull.contractorContactEmail.value}")
    private String value;

在controller中,我使用@org.springframework.validation.annotation.validated。

PS2.我确信我的messageSource工作正常,因为如果我将这段代码添加到ExceptionHandler中,它可以很好地转换,但我知道这是一种糟糕的做法。

exception.getConstraintViolations().forEach(violation -> {
            String messageTemplate = violation.getMessageTemplate();
            if (messageTemplate.startsWith("{") && messageTemplate.endsWith("}")) {
                String key = StringUtils.substring(messageTemplate, 1, messageTemplate.length() - 1);
                v.addError(violation.getPropertyPath().toString(), messageSource.getMessage(key, null, LocaleContextHolder.getLocale()));
            }
});

共有1个答案

端木权
2023-03-14

我马上可以告诉您的是,从您的配置来看,您的消息在错误的地方-您已经将消息源配置为查看i18/messages,但是您的消息在类路径根中。因此,您的消息源定义应该如下所示:

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("messages");
    messageSource.setDefaultEncoding("UTF-8");
    messageSource.setUseCodeAsDefaultMessage(true);
    return messageSource;
}

除此之外,其余的配置看起来还不错。我猜您使用的是WebMVCConfigurerAdapter类?

编辑:供以后的读者参考,该问题与配置无关,JPA实体在@OneTomany字段上缺少@valid注释,因此控制器级验证无法获取它,Hibernate的JPA验证器使用默认消息。

 类似资料:
  • 我试图覆盖默认的Hibernate验证器消息,但没有成功。我已经为几个文本使用了一个资源包,它工作得很好。问题在于验证器的消息。 详细内容: 我创建了以下文件:ValidationMessages\u de.properties并将其放置在\src\main\resources\translations\ValidationMessages\u de.properties下。该文件具有以下资源:o

  • 我试图理解spring中的验证消息和国际化机制,并编写了以下代码: Bean配置: 资源文件系统结构: 消息。属性: messages\u it。属性: 当我提交表单时,得到的错误消息是:{m1}。我是否缺少一些代码?

  • 本文向大家介绍Spring4整合Hibernate5详细步骤,包括了Spring4整合Hibernate5详细步骤的使用技巧和注意事项,需要的朋友参考一下 Spring与Hiberante整合 通过hibernate的学习,我们知道,hibernate主要在hibernate.cfg.xml配置文件中 接下来我们看一下hibernate的一个配置文件 hibernate配置文件 hibernate

  • 我试图让我的javascript验证电话号码输入,并在用户输入信息不正确时显示消息。我还设置了另外两个输入,所以我复制了其中一个,并用phoneNumber替换了名称,但没有结果。没有HTML的替代品,请它是我必须使用我的评估。 这里我只包含了电话号码输入的代码。http://jsfiddle.net/29ZNV/ 超文本标记语言 JAVASCRIPT

  • 我有一个带有浮动字段和精度验证的模型。当验证失败但不起作用时,我想显示我自己的自定义错误消息。 根据Rails Gudes的说法,“:消息选项允许您指定验证失败时将添加到错误集合中的消息。当不使用此选项时,活动记录将为每个验证助手使用相应的默认错误消息。:消息选项接受字符串或程序。” 我完全按照这里的例子来做,但它不起作用。 我做错了什么? 这就是我到目前为止学到的。我在测试中将价格设置为空,现在

  • 我有一个测试类,在那里我测试一个用@NotNull注释的域模型 在这个资源包中,支持相当多的语言(英语、德语、法语……) 例 @NOTNULL违反德语消息 当我在测试时,我如何强制Hibernate验证器为来自资源包的冲突消息选择特定的语言?现在,我收到英文违规信息。然而,在另一个机器德国。