Spring MVC的具有产生错误代码从绑定错误的渲染错误消息的策略:MessageCodesResolver。如果您设置spring.mvc.message-codes-resolver-format属性PREFIX_ERROR_CODE或POSTFIX_ERROR_CODE,Spring Boot会为您创建一个(请参阅中的枚举DefaultMessageCodesResolver.Format
感觉一头雾水:
于是搜索了一波,作用:在springmvc进行参数绑定的时候,会出现一些绑定错误,那么他就会讲绑定错误的信息传递到BindingResult中,可以从其对象中获取。
下面代码示例
@ResponseBody
@RequestMapping(value="/save", method= RequestMethod.GET)
public String saveUser(User user, BindingResult bindingResult) {
// 如果在绑定的时候,发生错误,那么错误信息就会保存在BindingResult 这里面,从里里面可以获取具体信息
if(bindingResult.hasErrors()){
bindingResult.getAllErrors().forEach(item -> {
System.out.println(item.getObjectName());
System.out.println(item.getArguments());
System.out.println(item.getDefaultMessage());
System.out.println(item.getCode());
});
}
return "success";
}
但是如果每一个控制器都写上这个的话,不但增加增加工作量,而且可读性也是比较差的,如果使用这种方式来实现的话,感觉上面是不合理的,那么如果想要实现这中功能的话,需要利用springmvc的全局异常处理。
使用SpringMvc的注解@ControllerAdvice来进行全局异常处理,
然后出来的异常类为:BindException:(org.springframework.validation.BindException)
具体代码实现:
package com.osy.config;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@ControllerAdvice
public class MyControllerAdvice {
@ExceptionHandler(value = BindException.class)
public void exceptionHandler(BindException e, HttpServletResponse response) throws IOException {
StringBuffer msg = new StringBuffer();
e.getFieldErrors().forEach(item -> {
msg.append("对象:【").append(item.getObjectName()).append("】");
msg.append(" 字段: 【").append(item.getField()).append("】 ");
msg.append(" 参数绑定错误:");
msg.append(" 错误值为: 【").append(item.getRejectedValue()).append("】 ");
});
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.write(msg.toString());
out.flush();
out.close();
}
}
然后我们测试一下,创建一个实体User:
public class User {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后写一个控制器
import com.osy.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("users")
public class MyController {
@ResponseBody
@RequestMapping(value="/save", method= RequestMethod.GET)
public String saveUser(User user) {
return "success";
}
}
请求地址:(实际改成你自己的项目地址,访问原则就是age为int类型,但是我们传一个不能解析为数字的字符串即可)
http://localhost:8080/users/save?age=fadfsafds
最后得到结果
对象:【user】 字段: 【age】 参数绑定错误: 错误值为: 【fadfsafds】
user:就是他要绑定到对象的变量名,
age:则是绑定错误的字段
最后面的则是传递的错误值。
这样是不是就简单很多了,再我们提交表单的时候,加上这么一个验证,就好很多了,直接看到返回结果,不用来到后台看日志了,对于前后端分离,未尝不是一件增加工作效率的好事。