绑定Spring MVC Controller上的错误并输入BindingResult

Fal*_*lci 2 controller spring-mvc illegalargumentexception

当我尝试在我的类中执行"绑定"时,它会抛出异常,但是如何在表单上显示错误?

控制器:

@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 ??
                }
            }
        }

    });
Run Code Online (Sandbox Code Playgroud)

电话:

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);
}
Run Code Online (Sandbox Code Playgroud)

chekArgument来自Google Preconditions

当phone无效时,抛出IllegalArgumentException ..但是如何将它放在BindingResult中

小智 5

我假设你使用的是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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

要将错误与特定表单相关联,您可以使用:

result.rejectValue("field1", "messageCode", "Default error message");
Run Code Online (Sandbox Code Playgroud)

此外,BindingResult.reject()将错误消息与整个表单相关联.所以选择哪一个适合你.希望有所帮助!