无法从messages.properties文件

时间:2017-06-28 06:08:36

标签: spring spring-mvc hibernate-validator spring-restcontroller spring-rest

我正在创建一个简单的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 / resources文件夹中。

NotEmpty.employeeModel.name = Employee name is required.

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

我甚至尝试过以下配置;

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

请帮助我!

5 个答案:

答案 0 :(得分:1)

好吧,也许有点晚了,但这绝对适合我。

尝试更改此 MessageSource 配置:

@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.FinalHibernate Validator 5.4.2.Final版本进行了测试。

答案 1 :(得分:0)

您需要告诉validator使用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;

答案 2 :(得分:0)

旧问题,但这对我有用:

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

答案 3 :(得分:0)

在做完所有正确的事后,应用在上提到的所有修复程序 堆栈溢出并花费数小时只是为了使其正常工作,我终于能够通过在我的messages.properties文件中添加以下内容来对其进行修复

"# suppress inspection "UnusedProperty" for whole file"

请注意,我使用的是intellij,出于某种奇怪的原因,它没有阅读我的消息。

答案 4 :(得分:-1)

如果仍然打开可能会有帮助。 对于类似的情况感到困惑,我通过明确使用Interpolator来解决它:

 <!-- 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}")

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

Why Spring Message Interpolation Argument Replacement using Hibernate Validator don't work? How to use annotation validation in Spring with error message gotten from properties file?