占位符未在Hibernate验证中的ValidationMessages.properties文件中显示变量值

时间:2016-10-10 09:58:34

标签: java spring validation

我在Spring Boot项目中使用Hibernate验证。虽然我能够将ValidationMessage.properties文件中的消息以及大括号中的参数读作{min}{max}

Size.accountRequestBean.firmName=size should  be between {min} and {max}

ValidationMessages.properties

Size.accountRequestBean.firmName={0} should  be between {1} and {2}

但是当我使用Size.accountRequestBean.firmName={0} should be between {1} and {2}时,显示的消息{0}应该在{1}{2}之间:

  

预期:大小应在2到30之间。

DemoApplication.java

@SpringBootApplication
public class DemoApplication extends WebMvcConfigurerAdapter{


    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

Bean.java

public class Bean {

    @Size(min=2, max=30,message="{Size.accountRequestBean.firmName}")
    private String firmName;
}

我正在使用的验证依赖项:

<!-- Hibernate Validator -->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.0.0.GA</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.3.1.Final</version>
</dependency>

那么请说明我做错了什么?

2 个答案:

答案 0 :(得分:0)

ValidationMessage.properties文件重命名为messages.properties(默认情况下,Spring希望在resources文件夹下找到它)并将以下属性放入其中:

bean.hasErrors=Please fix the following errors
bean.firmName=Firm Name
Size.bean.firmName={0} should  be between {2} and {1}

请注意,此处的优先顺序为: code.objectName.fieldName objectName必须与您的班级名称相同,因此accountRequestBean只放bean(作为您的对象Bean.java)。

然后,您可以省略message注释中的@Size键。当您使用messages.properties文件时,Spring Boot会自动获取其消息:

public class Bean {
    @Size(min = 2, max = 30)
    private String firmName;

    // getter, setter
}

确保在控制器中使用@Valid注释以使用Bean验证,例如:

@RequestMapping(value = "/doBean", method = RequestMethod.POST)
public String doBean (@Valid Bean checkoutCommand, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "form";
    }
    return "success";
}

请查找complete code example

你应该得到这样的东西:

enter image description here

答案 1 :(得分:0)

在我的项目中,问题出在以下设置:

var messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setUseCodeAsDefaultMessage(true);

之后

setUseCodeAsDefaultMessage(false)

一切正常