【问题标题】:Spring MVC Validation custom messageSpring MVC 验证自定义消息
【发布时间】:2013-03-30 12:56:53
【问题描述】:

我的问题是我有一个表单,其中包含带有一些选择选项值的 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 值 ACTIVE!NVALID;嵌套异常是 java.lang.IllegalArgumentException: No enum constant tm.sys.validator.AgentState.ACTIVE!NVALID

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

【问题讨论】:

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


    【解决方案1】:

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

    typeMismatch.state=You provided invalid state
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      相关资源
      最近更新 更多