有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Spring中使用注释验证,并从属性文件获取错误消息?

我是个新手

我在我的域类中设置验证,如下所示:

public class Worker {

    @NotNull(message="Name must be input")
    @Size(min=1,max=50, message="Name must not exceed 50 characters")
    private String name;
...

}

以下是jsp文件:

<form:input path="code" readonly="false" />
<font color="red"><form:errors path="code" />

以及控制器代码:

@RequestMapping(value="/test",method=RequestMethod.POST)
    public void form(@Valid Worker worker, BindingResult result) {

        if (result.hasErrors()) {
            return;
        }
...

它可以工作,但是我如何在我的messageSource中用一些文本(比如worker.Name.overflow)替换“Name不能超过50个字符”?我需要在BindingResult中添加messageResolver吗

所有的搜索结果似乎都是关于编写自定义验证器类的,但我现在想使用注释。我很肯定有办法,因为在this question有人这样做了


共 (2) 个答案

  1. # 1 楼答案

    要让Hibernate validator查找代码,请将消息的值放在大括号中,例如@NotNull(message="{worker.name.NotNull}",然后将翻译放在ValidationMessages中。类路径根目录中的属性(/WEB-INF/classes,Maven中的resources文件夹,等等)

    验证器实现会独立地查找这些消息,它们会继续执行已翻译为默认消息的BindingResult。发生在Spring消息源之外。理论上,您可以重写LocalValidatorFactorybean,将验证器的消息输出作为代码放到Errors对象上,然后在注释中去掉大括号,以便Hibernate验证器将其传递出去。将JSR-303 ConstraintViolations转换为Spring错误的源代码非常简单,可以读取和扩展。它只是将注释的名称作为代码,注释属性作为args,然后验证程序的翻译作为默认消息。您可以阅读实现here

    您可以在javax.validation.MessageInterpolator中添加一个javax.validation.Configuration,告诉它在其他属性文件中查找消息。如果您使用的是Spring LocalValidatorFactory bean,那么它上面有一个setMessageInterpolator(),可以用来注入一个。检查this源代码以获取Hibrate提供程序实现

  2. # 2 楼答案

    这是对问题的一点解释

    @Size(min = 1, max = 50, message = "Email size should be between 1 and 50")
    

    现在从验证标签中删除{message=“电子邮件大小应该在1到50之间”

    完成此操作后,您的注释将如下所示

    @Size(min = 1, max = 50)
    

    现在在控制器端调试提交表单时调用的方法。下面是我的方法,当用户点击提交时接收请求

    public static ModelAndView processCustomerLoginRequest(IUserService userService, LoginForm loginForm, 
        HttpServletRequest request, HttpSession session, BindingResult result, String viewType, Map<String, LoginForm> model)
    

    现在在方法的第一行放置一个调试点,并调试参数“result”

    BindingResult result
    

    在dubugging时,你会在codes数组中找到这样的字符串

    Size.loginForm.loginId
    

    现在在属性文件中定义这个字符串,并根据该字符串定义一条消息。编译并执行。每当该注释无法验证时,就会显示该消息

    Size.loginForm.loginId=email shouldn't be empty.
    

    基本上,spring将自己的字符串作为其属性文件消息的键。在上面的键中

    Size(@Size) = validation annotation name
    loginForm = My Class Name
    loginId = Property name in LoginForm class.