2013-03-30 40 views
3

我的问题是,我有一个具有HTML选择元素与一些选择的选项值&我想用验证这些价值的一种形式:Spring MVC的验证custome消息

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.AgentS物业状态的泰特;嵌套异常是org.springframework.core.convert.ConversionFailedException:无法从类型java.lang.String转换为类型@ javax.validation.constraints.NotNull tm.sys.validator.AgentState的值为ACTIVE!NVALID;嵌套的例外是java.lang.IllegalArgumentException异常:无枚举常量tm.sys.validator.AgentState.ACTIVE NVALID

我寻觅了很多关于这个问题,但没有解决方案的帮助我提供了我定制的消息显示,以用户。 如果您有任何解决方案,请将其提供完整,因为我还没有那么高级的程序员。

非常感谢!

回答

4

您需要添加下列项之一:typeMismatch,typeMismatch.state或typeMismatch.agentValidator.state到您的Messages.properties(或ValidationMessages.properties - 无论消息属性文件已配置了您的验证)。

typeMismatch.state=You provided invalid state 

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

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

+0

非常感谢你,工作就像一个魅力! – Mehdi