Spring验证@AssertTrue自定义错误代码/消息

时间:2017-01-09 21:18:00

标签: java spring validation spring-mvc spring-boot

我在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}"字符串作为错误消息而不是已解析的消息。

我的代码出了什么问题?这是设置自定义错误代码的正确语法吗?

4 个答案:

答案 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