SpringMVC统一处理返回异常--@ControllerAdvice

本文介绍了如何在SpringMVC中实现统一的异常处理。首先,自定义了多个运行时异常来匹配不同错误类型。接着,定义了一个自定义异常信息类以结构化错误信息。然后,创建了一个使用@ControllerAdvice注解的控制器增强类,该类中的@ExceptionHandler方法能捕获并处理特定异常。同时,@ModelAttribute用于在Model上设置共享数据,而@InitBinder则用于在数据绑定前进行初始化。通过单元测试验证了异常处理的正确性,最终实现了全局的异常处理机制。
摘要由CSDN通过智能技术生成

自定义一个异常

自定义若干个运行时异常,可以根据不同的错误类型定义多个

public class TestException extends RuntimeException {

    private String code;

    public TestException(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

}

自定义异常信息类

根据需求自第一字段

public class ErrorResponse {
    private String code;

    private String message;

    public ErrorResponse(String code, String message) {
        this.code = code;
        this.message = message;
    }

    public ErrorResponse() {
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public static ErrorResponse build(String code, String message) {
        return new ErrorResponse(code, message);
    }
}

controller增强类

@ControllerAdvice表示启动项目后, 被 @ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法,都会作用在 @RequestMapping 注解的方法上

  1. @ExceptionHandler表示捕获指定异常,里面的参数就是指具体捕获哪种异常,如果需要,也可以直接捕获Exception
  2. @ModelAttribute表示在Model上设置的值,对于所有被 @RequestMapping 注解的方法中,都可以通过 ModelMap 获取
  3. @InitBinde表示在其执行之前初始化数据绑定器
@ControllerAdvice
public class TestAdvice {

    // 可以定义多个,用来捕获不同的异常
    @ExceptionHandler(value = {TestException.class})
    public ResponseEntity<ErrorResponse> test(HttpServletRequest request, TestException e) {
        System.out.println("log-----------" + e.getCode() + e.getMessage());
        return ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body(ErrorResponse.build(e.getCode(), "test exception message"));
    }

    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("name", "lalala");
    }
}

controller测试

@RestController
public class UserController {

    /**
     * 获取@ModelAttribute的方法一
     *
     * @param modelMap
     * @return
     */
    @GetMapping("/test1")
    public String test1(ModelMap modelMap) {
        return "hello springmvc test1|" + modelMap.get("name");
    }

    /**
     * 获取@ModelAttribute的方法二
     *
     * @param name
     * @return
     */
    @GetMapping("/test3")
    public String test3(@ModelAttribute("name") String name) {
        return "hello springmvc test3|" + name;
    }

    /**
     * 异常
     *
     * @param num
     * @return
     */
    @GetMapping("/test2/{num}")
    public ResponseEntity<Object> test2(@PathVariable int num) {
        if (num != 1) {
            throw new TestException("001");
        }
        return ResponseEntity.status(HttpStatus.OK).body("hello springmvc test2");
    }
}

结果

# http://localhost:8080/test3
# httpstatus:200
hello springmvc test3|lalala

# http://localhost:8080/test1
# httpstatus:200
hello springmvc test1|lalala

# http://localhost:8080/test2/1
# httpstatus:200
hello springmvc test2

# http://localhost:8080/test2/2
# httpstatus:422
{"code":"001","message":"test exception message"}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值