3

私の問題は、いくつかの選択オプション値を持つ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 にカスタム メッセージが表示されず、代わりに次のメッセージが表示されます。

タイプ java.lang.String のプロパティ値を、プロパティの状態に必要なタイプ tm.sys.validator.AgentState に変換できませんでした。ネストされた例外は org.springframework.core.convert.ConversionFailedException: Failed to convert type java.lang.String to type @javax.validation.constraints.NotNull tm.sys.validator.AgentState for value ACTIVE!NVALID; ネストされた例外は java.lang.IllegalArgumentException: No enum constant tm.sys.validator.AgentState.ACTIVE!NVALID です

この問題をよく検索しましたが、カスタマイズされたメッセージをユーザーに表示するのに役立つ解決策はありませんでした。私はまだそれほど高度なプログラマーではないので、これに対する解決策がある場合は、それを完全に提供してください。

4

1 に答える 1

4

次のキーのいずれかを追加する必要があります。

typeMismatch.state=You provided invalid state

メッセージ プロパティに追加する必要がある正確なキー名は、BindingResult から見つけることができます。result.getFieldError().getCodes() を見てください (これには、最初のフィールド エラーのコードが含まれている必要があります)。

これは、フォームが送信した値を必要なタイプ (この場合は列挙型) に変換できない場合に、デフォルト メッセージ (表示されているもの) をオーバーライドします。

于 2013-03-30T14:18:08.417 に答える