2013-03-30 77 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