2

クラスで「バインド」を実行しようとすると、例外がスローされますが、フォームにエラーを表示するにはどうすればよいですか?

コントローラ:

@InitBinder
public final void binder(WebDataBinder binder) {        
    binder.registerCustomEditor(Telefone.class, new PropertyEditorSupport(){

        @Override
        public void setAsText(String value){
            if(null != value){
                try{
                    setValue(Telefone.fromString(value));
                } catch (IllegalArgumentException e) {
                    // what to do here ??
                }
            }
        }

    });

電話:

public static Telefone fromString(String s) {
    checkNotNull(s);
    String digits = s.replaceAll("\\D", "");
    checkArgument(digits.matches("1\\d{2}|1\\d{4}|0300\\d{8}|0800\\d{7,8}|\\d{8,13}"));
    return new Telefone(digits);
}

checkArgument は Google Preconditions からのものです

電話が有効でない場合、IllegalArgumentExceptionがスローされます..しかし、それをBindingResultに入れる方法

4

1 に答える 1

6

Java 5 を使用していると仮定しているため、@Valid (JSR303 なし) は使用できません。その場合、唯一のオプションは BindingResult を使用することです。

できることは次のとおりです。

@Controller
public class MyController {

    @RequestMapping(method = RequestMethod.POST, value = "myPage.html")
    public void myHandler(MyForm myForm, BindingResult result, Model model) {
        result.reject("field1", "error message 1");
    }
}

私のJSP:

<form:form commandName="myForm" method="post">
<label>Field 1 : </label>
<form:input path="field1" />
<form:errors path="field1" />

<input type="submit" value="Post" />
</form:form>

エラーを特定のフォームに関連付けるには、次を使用できます。

result.rejectValue("field1", "messageCode", "Default error message");

また、BindingResult.reject() はエラー メッセージをフォーム全体に関連付けます。したがって、どちらがあなたに適しているかを選択してください。それが役立つことを願っています!

于 2013-01-16T17:01:09.943 に答える