Springboot官网学习(7、Web应用程序【四Spring Web MVC 之MessageCodesResolver 参数绑定,全局异常处理参数绑定错误】)

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:则是绑定错误的字段
最后面的则是传递的错误值。
这样是不是就简单很多了,再我们提交表单的时候,加上这么一个验证,就好很多了,直接看到返回结果,不用来到后台看日志了,对于前后端分离,未尝不是一件增加工作效率的好事。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值