Life with teacher Lemon.

SpringBoot 处理 404 异常返回 JSON 格式数据

2021.03.31 | 共 364 字,阅读需约 1 分钟.

Spring Boot 默认对 404 异常处理会重定向到 /error 进行处理,现在流行前后端分离开发,后端基本上不配置静态资源,前后端交互使用 XML 或者 JSON 格式的报文,本文就以返回 JSON 为例,来处理 404 异常。

接上一节Spring Boot 初体验,当我们访问任何不存在的接口时,会触发 NoHandlerFoundException 异常,我们只需要使用 Spring 提供的全局异常处理机制拦截该异常,并重新返回参数即可。

首先我们需要在 application.properties 中配置以下参数

# NoHandlerFound异常
spring.mvc.throw-exception-if-no-handler-found=true
# 资源文件不配置映射
spring.web.resources.add-mappings=false

引入 lombok

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

定义全局返回值 Java Bean

package com.lemon.boot.common;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ApiResult {
    private int code;
    private String msg;
    private Object data;

    public ApiResult(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public ApiResult(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
}

定义全局异常处理类

package com.lemon.boot.common;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.NoHandlerFoundException;

@ResponseBody
@ControllerAdvice
public class BootException {

    private static final Logger LOGGER = LoggerFactory.getLogger(BootException.class);

    @ExceptionHandler(NoHandlerFoundException.class)
    public ApiResult handleNotFoundException(NoHandlerFoundException e) {
        LOGGER.error("{}.", e.getMessage());
        return new ApiResult(404, "Not Found");
    }
}

然后我们重新启动工程,再次访问不存在的接口时,可以看到现在返回的就是 404 的JSON格式消息。

{"code":404,"msg":"Not Found"}
发表评论
今日诗词