栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot中使用ResponseBodyAdvice对异常,分页等请求进行封装

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot中使用ResponseBodyAdvice对异常,分页等请求进行封装

在java 中,我们常常需要对接口返回的数据进行统一的封装,如调用接口异常的时候,我们不希望直接在后台报错,而是需要给前端或者友好提示是什么异常。又或者在处理分页请求的时候,我们可能需要对数据进行统一的封装(返回总条数,数据集等),对于这个需求,我们可以使用ResponseBodyAdvice 这个接口实现。 以下是几个效果图

1.
2.
3.
4.
5.

ResponseBodyAdvice 是 spring 框架中提供的一个接口,其有两个方法,如下:

supports :返回参数是一个boolean类型的数据,表示是否进行响应特殊处理 beforeBodyWrite:表示需要进行特殊处理的时候,需要做的具体处理逻辑

由此可见,通过这两个方法,我们就可以对响应体进行封装。

1.我们新建一个配置类,实现ResponseBodyAdvice 接口,具体代码如下:
package com.xhw.demo.config;

import com.github.pagehelper.Page;
import com.xhw.demo.exception.ResponseErrorBody;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;



@ControllerAdvice
public class ResponseConfig implements ResponseBodyAdvice {

    @Override
    public boolean supports(MethodParameter methodParameter,
                            Class> aClass) {

        Class  clazz = methodParameter.getParameterType();
        if (clazz.equals(String.class) || clazz.equals(ResponseErrorBody.class)){
            return false;
        }
        // todo 可以配置 需要放过的路由等,自行定义
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object o,
                                  MethodParameter methodParameter,
                                  MediaType mediaType,
                                  Class> aClass,
                                  ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {

        Class clazz = methodParameter.getParameterType();
        Map rtnMap = new HashMap(3 << 1);
        rtnMap.put("status","ok");
        rtnMap.put("timestamp",new Date());
        if (clazz.equals(Page.class)){
            // 对分页的请求进行特殊处理
            Page page = (Page)o;
            rtnMap.put("data",page.getResult());
            rtnMap.put("total",page.getTotal());
            rtnMap.put("pageNum",page.getPageNum());
            rtnMap.put("pageSize",page.getPageSize());
            return rtnMap;
        }
        rtnMap.put("data",o);
        return rtnMap;
    }
}

 
2.controller 类 
package com.xhw.demo.controller;

import com.github.pagehelper.PageHelper;
import com.xhw.demo.entity.User;
import com.xhw.demo.exception.AuthException;
import com.xhw.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;



@Controller
@ResponseBody
public class TestController {

    @Autowired
    private UserMapper userMapper;

    
    @RequestMapping("/test01")
    public String test01(){
        throw new AuthException();
    }

    
    @RequestMapping(value = "/test02",method = RequestMethod.GET)
    public String test02(){
        return "test02";
    }

    
    @RequestMapping(value = "/test03",method = RequestMethod.GET)
    public User test03(){
        return new User(1,"user_001","法半夏");
    }

    
    @RequestMapping(value = "/test04",method = RequestMethod.GET)
    public void test04(@RequestParam  Integer param){

    }

    
    @RequestMapping(value = "/test05",method = RequestMethod.GET)
    public List test05(){
        PageHelper.startPage(1,10);
        return userMapper.getUserList();
    }

}
3. 实体User
package com.xhw.demo.entity;

import lombok.Data;


@Data
public class User {

    private Integer id;

    private String uid;

    private String username;


    public User(Integer id, String uid, String username) {
        this.id = id;
        this.uid = uid;
        this.username = username;
    }
}

4. 关于异常的类 4.1 自定义 AuthException
package com.xhw.demo.exception;


public class AuthException extends RuntimeException{
    public AuthException(){}

    public AuthException(String message){
        super(message);
    }
}
4.2 异常枚举类ExceptionEnum
package com.xhw.demo.exception;



public enum ExceptionEnum {
    
    AUTH_EXCEPTION(1001,"接口认证失败"),

    
    MISSING_REQUEST_PARAM_EXCEPTION(2001,"缺少请求参数"),

    
    REQUEST_METHOD_NOT_SUPPORT(2002,"请求方法不支持");

    
    private Integer code;

    
    private String message;

    ExceptionEnum(Integer code,String message){
        this.code = code;
        this.message = message;
    }

    public Integer getCode(){
        return this.code;
    }
    public String getMessage() {
        return this.message;
    }

}
4.3 异常处理类
package com.xhw.demo.exception;

import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;



@ControllerAdvice
@ResponseBody
public class ExceptionHandlerClass {

    
    @ExceptionHandler(AuthException.class)
    public ResponseErrorBody authExceptionHandler(){
        return new ResponseErrorBody(ExceptionEnum.AUTH_EXCEPTION.getCode(),
                ExceptionEnum.AUTH_EXCEPTION.getMessage());
    }

    
    @ExceptionHandler(MissingServletRequestParameterException.class)
    public ResponseErrorBody missingParamHandler(){
        return new ResponseErrorBody(ExceptionEnum.MISSING_REQUEST_PARAM_EXCEPTION.getCode(),
                ExceptionEnum.MISSING_REQUEST_PARAM_EXCEPTION.getMessage());
    }

    
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public ResponseErrorBody requestMethodExceptionHandler(){
        return new ResponseErrorBody(ExceptionEnum.REQUEST_METHOD_NOT_SUPPORT.getCode(),
                ExceptionEnum.REQUEST_METHOD_NOT_SUPPORT.getMessage());
    }
}

4.4 异常响应体类 ResponseErrorBody
package com.xhw.demo.exception;


public class ResponseErrorBody {
    
    private Integer code;

    
    private String message;

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

    public Integer getCode() {
        return code;
    }

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

    public String getMessage() {
        return message;
    }

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

5. UserMapper 类
package com.xhw.demo.mapper;

import com.xhw.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;


@Mapper
public interface UserMapper {
    List getUserList();
}
6. UserMapper.xml



  
    
    SELECT * FROM user
    
  

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号