其他分享
首页 > 其他分享> > Spring MVC验证自定义消息

Spring MVC验证自定义消息

作者:互联网

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

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中没有显示自定义消息,而是显示以下消息:

Failed to convert property value of type java.lang.String to required type tm.sys.validator.AgentState for property state; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @javax.validation.constraints.NotNull tm.sys.validator.AgentState for value ACTIVE!NVALID; nested exception is java.lang.IllegalArgumentException: No enum constant tm.sys.validator.AgentState.ACTIVE!NVALID

我为此问题进行了大量搜索,但是没有一种解决方案可以帮助我向用户显示定制的消息.
如果您对此有任何解决方案,请提供完整的信息,因为我还不是高级程序员.

解决方法:

您需要将以下密钥之一添加到Messages.properties(或ValidationMessages.properties-您使用验证器配置的任何消息属性文件)中的typeMismatch,typeMismatch.state或typeMismatch.agentValidator.state.

typeMismatch.state=You provided invalid state

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

对于无法将表单提交的值转换为所需类型(您的情况为枚举)的情况,这将覆盖默认消息(您所看到的消息).

标签:validation,bean-validation,spring,java-ee,spring-mvc
来源: https://codeday.me/bug/20191031/1972904.html