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

无法从messages.properties文件中读取验证消息

漆雕深
2023-03-14

我正在创建一个简单的Spring REST应用程序,下面是我的Spring配置类;

@Configuration
@EnableWebMvc
@ComponentScan( basePackages = "com.example.spring" )
public class AppConfig {    
    @Bean
    public ReloadableResourceBundleMessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:/messages");
        return messageSource;
    }   
}

这就是我在控制器类中所做的;

@RequestMapping(value = "/create", method = RequestMethod.POST)
    public ResponseEntity<Map<String, String>> createEmployee(@Valid @RequestBody EmployeeModel employeeModel, BindingResult result) {
        if (result.hasErrors()) {
            System.out.println("Errors: " + result.getAllErrors());
            Map<String, String> response = new HashMap<>();
            response.put("status", "failure");
            return new ResponseEntity<>(response, HttpStatus.OK);
        }
        employeeService.createEmployee(employeeModel);
        Map<String, String> response = new HashMap<>();
        response.put("status", "success");
        return new ResponseEntity<>(response, HttpStatus.OK);
    }

我已经在EmployeeModel中注释了我的姓名字段,如下所示;

@NotEmpty
@Column(name = "name")
private String name;

这是我的messages.properties文件,在src/main/资源文件夹中。

NotEmpty.employeeModel.name = Employee name is required.

但我无法读取此错误消息,我只收到@NotEmpty的默认消息。

我甚至尝试了以下配置;

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("classpath:/messages");
    return messageSource;
}

请帮我拿这个!

共有3个答案

经正祥
2023-03-14

您需要告诉验证器使用您的MessageSource

@Bean
public javax.validation.Validator validator() {
    final LocalValidatorFactoryBean factory = new LocalValidatorFactoryBean();
    factory.setValidationMessageSource(messageSource());
    return factory;
}

@Bean
public ReloadableResourceBundleMessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:/messages");
    return messageSource;
}

并在您的模型上指定消息键:

@NotEmpty(message = "{NotEmpty.employeeModel.name}")
private String name;
蒋航
2023-03-14

如果仍然打开,可能会有所帮助。在类似的情况下,我明确使用插值器解决了这个问题:

 <!-- Messagesource for locales -->
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
            <util:list>
                <value>classpath:locales/messages/validation</value>
            </util:list>
        </property>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

    <bean id="resourceBundleMessageInterpolator"
          class="org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator">
        <constructor-arg index="0">
            <bean class="org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator">
                <constructor-arg index="0" ref="messageSource"/>
            </bean>
        </constructor-arg>
    </bean>

    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="messageInterpolator" ref="resourceBundleMessageInterpolator"/>
    </bean>

    <mvc:annotation-driven validator="validator" />

与其他线程中的建议相反,假设自动注入通过:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource" ref="messageSource"/>
</bean>

基于以上内容,我还通过使用括号在验证属性文件中使用占位符:即:

@NotNull(message = "{message.notnull}")

此外,以下线程提示对我来说也是必须的:

为什么使用Hibernate验证器替换Spring消息插值参数不起作用?如何在Spring中使用注释验证,并从属性文件中获取错误消息?

黄仲渊
2023-03-14

嗯,可能有点晚了,但这对我来说绝对有效。

尝试为此更改您的MessageSource配置:

java prettyprint-override">@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasenames("classpath:/messages");
    messageSource.setUseCodeAsDefaultMessage(false);
    messageSource.setCacheSeconds((int) TimeUnit.HOURS.toSeconds(1));
    messageSource.setFallbackToSystemLocale(false);
    return messageSource;
}

您的LocalValidatorFactoryBean应该与您已经定义的相同。

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

我使用Spring 5.0.1进行了测试。最终Hibernate Validator 5.4.2。最终版本。

 类似资料:
  • 我有一个简单的登录模型类,几乎没有数据注释验证 View是一个部分View,如下所示: 我相信我已经做了验证消息显示所需的所有事情,但它没有,客户端验证也没有。在母版页的头部区域,我还包括了以下脚本 是什么导致了这个问题?解决办法是什么?

  • 我正在使用Spring验证来验证Rest Controller输入,如果有人能告诉我是否有可能在异常情况下抛出自定义消息,并且自定义消息应来自属性文件,我将不胜感激。 用户控制器.java 用户验证程序.java 消息.属性 自定义消息源配置.java 浏览器响应

  • 我昨天让它工作,然后我做了一些事情,现在我一直试图修复它几个小时,我只是无法让它工作了。 我有一个包含

  • 问题内容: 我在做一些真正愚蠢的事情时遇到了一个大问题。也就是说,打开流到我的META-INF文件夹中的资源文件。我正在使用jar工具并执行以下操作: 我只是一个空!该项目是使用maven构建的,xsd文件最终位于META-INF文件夹中,但仍然无法使用。 我不理解的是背后的理论?ClassLoader如何在文件系统中执行查找?如何获得文件? 问题答案: 尝试删除第一个斜杠: 如果要在对象上调用方

  • 我正在尝试从com包中的CSV文件中读取值。实例但当我使用以下语法运行代码时: 上面写着: java.io.FileNotFoundException: Dataset.csv 我也尝试过使用: 仍然不工作。任何帮助都会很有帮助。谢谢

  • 我正在运行此命令以从普通群集(未安装hadoop)中读取 Azure 数据砖中的数据。 我得到了这个错误 你能建议我需要安装什么样的jar来让它工作吗