我在Spring MVC项目的表单对象中使用javax.validation.constraints.AssertTrue
注释(Spring Boot 1.4.2)。
我的课程类似于:
public class CommandForm {
@NotEmpty
@Email
private String email;
// ...
@AssertTrue(message="{error.my.custom.message}")
public boolean isValid(){
// validate fields
}
}
方法isValid
被正确调用,验证过程正常,但我的自定义错误代码未正确解析。
我的error.my.custom.message
文件中有一个message.properties
字段,但是当验证失败时,我会将"{error.my.custom.message}"
字符串作为错误消息而不是已解析的消息。
我的代码出了什么问题?这是设置自定义错误代码的正确语法吗?
答案 0 :(得分:1)
我认为您可能遇到的唯一问题是Java Validation API (JSR-303)
默认情况下会从名为ValidationMessages.properties
的文件(/resources
下)中读取这些消息。
创建一个具有该名称的文件并在那里移动您的消息...然后再试一次。它应该工作!
注意:您可以更改文件名,但“按惯例”的名称就是这样。
答案 1 :(得分:1)
将您的邮件移至ValidationMessages.properties
文件
或者覆盖getValidator()
的{{1}}方法,使您的自定义WebMvcConfigurerAdapter
在春季加载,如下所示:
message.properties
答案 2 :(得分:1)
经过一些调试后我找到了解决方案。
设置自定义消息的最简单方法是在我的AssertTrue.commandForm.valid
中定义message.properties
字段。
无需在message
注释中设置@AssertTrue
参数。
答案 3 :(得分:1)
噢,金色的老歌。但是我认为这里的每个答案实际上都错了。我认为您已经超越了这一点,但是无论如何我都在为将来的读者解答。我看到两个问题:
最重要:您正在尝试测试类的验证,而不是属性文件中的消息。因此,您返回的字符串实际上就是您要测试的字符串:“ {error.my.custom.message}”。
现在,如果要进行测试以确保属性文件具有正确的字符串,则只需使用该标识符转到属性文件并获取要检查的字符串即可。我们通常不检查这些事情,因为那是主观的事情,消息可能会经常更改。然后您要针对不同语言环境的所有属性文件执行此操作吗?
现在第二点是,您确实应该将其放入将在DevOps管道(JUnit,TestNG?)中运行的实际单元和集成测试中。我会避免在类定义中放入断言(@Assert)。文档指出,@ Assert实际上供框架内部使用,而不是您自己使用:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/Assert.html。