Spring MVC验证自定义消息

时间:2013-03-30 12:56:54

标签: spring java-ee spring-mvc validation bean-validation

我的问题是我有一个带有html选择元素的表单,其中有一些选择值&我想使用以下方法验证这些值:

org.hibernate.validator.constraints
or
javax.validation.constraints

注释。 在这里你可以看到我的形式&我的选择元素:

<form:form action="../agents/add" method="POST" commandName="myAgent">
     <form:select path="state">
            <form:option value="ACTIVE" path="state">ACTIVE</form:option>
            <form:option value="LISTEN" path="state">LISTEN</form:option>
            <form:option value="DOWN" path="state">DOWN</form:option>
    </form:select>
</form:form>

我已经定义了我的控制器方法:

    @RequestMapping(value = "agents/add", method = RequestMethod.POST)
    public String addAgentSubmit(@ModelAttribute("myAgent") @Valid final AgentValidator agent, BindingResult result, RedirectAttributes redirect) {
      if (result.hasErrors()) {
        return "admin/agent/add";
      } 
       ...
    }

我还定义了一个像这样的ModelAttribute:

@ModelAttribute("myAgent")
 public AgentValidator getLoginForm() {
    return new AgentValidator();
 }

这是我的AgentValidator类:

public class AgentValidator {
    @NotEmpty(message = "your state can not be empty !")
    private AgentState state;
        getter & setter ...
}

这是我的AgentState:

public enum AgentState {
    ACTIVE, DOWN, PAUSED
 }

当我向表单输入错误的值时(如下所示):

<form:form action="../agents/add" method="POST" commandName="myAgent">
     <form:select path="state">
            <form:option value="ACTIVE!NVALID" path="state">ACTIVE</form:option>
            <form:option value="LISTEN" path="state">LISTEN</form:option>
            <form:option value="DOWN" path="state">DOWN</form:option>
    </form:select>
</form:form>

我提交表单后,我的JSP中没有显示自定义消息,而是会看到此消息:

  

无法将类型为java.lang.String的属性值转换为属性状态所需的类型tm.sys.validator.AgentState;嵌套异常是org.springframework.core.convert.ConversionFailedException:无法从类型java.lang.String转换为类型@javax.validation.constraints.NotNull tm.sys.validator.AgentState for value ACTIVE!NVALID;嵌套异常是java.lang.IllegalArgumentException:没有枚举常量tm.sys.validator.AgentState.ACTIVE!NVALID

我搜索了很多这个问题,但没有一个解决方案帮助我向用户提供我自定义的消息。 如果您有任何解决方案,请提供完整,因为我不是那么先进的程序员。

1 个答案:

答案 0 :(得分:4)

您需要在Messages.properties(或ValidationMessages.properties - 您使用验证程序配置的任何邮件属性文件)中添加以下密钥之一:typeMismatch,typeMismatch.state或typeMismatch.agentValidator.state。

typeMismatch.state=You provided invalid state

可以从BindingResult中找到需要添加到消息属性的确切键名。 看一下result.getFieldError()。getCodes()(这应该包含第一个字段错误的代码,如果有的话)。

如果表单提交的值无法转换为所需类型(在您的情况下为枚举),则会覆盖默认消息(您看到的消息)。