controller层响应返回封装

控制层响应封装

控制层请求正确返回相应拦截封装

package com.demo.autotest.common.response;

import com.demo.autotest.common.exception.DemoException;
import com.demo.autotest.dto.ResponseDTO;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@RestControllerAdvice(basePackages = {"com.demo.autotest.controller"})  // 用来拦截响应
public class ResponseControllerAdvice implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> aClass) {
        // 如果接口返回的类型是二进制,返回false,即不对对象进行beforeBodyWrite处理
        return !aClass.equals(ByteArrayHttpMessageConverter.class);
    }

    @Override
    public Object beforeBodyWrite(Object data, MethodParameter returnType, MediaType mediaType, Class<?
            extends HttpMessageConverter<?>> aClass, ServerHttpRequest request, ServerHttpResponse response) {
        // String类型不能直接包装,所以要进行些特别的处理
        //控制层的String类型的返回值在Spring MVC中通常被视为已经准备好的响应体内容。这意味着字符串内容会直接被写入HTTP响应,而不会经过额外的转换或处理。
        if (returnType.getGenericParameterType().equals(String.class)) {
            ObjectMapper objectMapper = new ObjectMapper();
            try {
                // 将数据包装在ResponseTemp里后,再转换为json字符串响应给前端
                return objectMapper.writeValueAsString(new ResponseDTO<>(data));
            } catch (JsonProcessingException e) {
                throw new DemoException("String类型返回错误");
            }
        }
        // 将原本的数据包装在ResponseTemp里
        return new ResponseDTO<>(data);
    }
}

控制层请求异常拦截封装

package com.demo.autotest.common.response;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.demo.autotest.common.constant.ResponseCode;
import com.demo.autotest.common.exception.DemoException;
import com.demo.autotest.dto.ResponseDTO;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice   // 用来接收没有捕获的异常 从而定义异常处理方法
public class ExceptionControllerAdvice {

    @ExceptionHandler(DemoException.class)  // 定义异常发生时处理办法
    public ResponseDTO<String> LMExceptionHandler(DemoException e) {
        // 未知的失败
        return new ResponseDTO<>(ResponseCode.FAILED, e.getMessage());
    }

    @ExceptionHandler(TokenExpiredException.class)
    public ResponseDTO<String> TokenExpireExceptionHandler(TokenExpiredException e) {
        return new ResponseDTO<>(ResponseCode.EXPIRED_ERROR, e.getMessage());
    }

    @ExceptionHandler(JWTDecodeException.class)
    public ResponseDTO<String> PasswordVerifyExceptionHandler(JWTDecodeException e) {
        return new ResponseDTO<>(ResponseCode.DECODE_ERROR, e.getMessage());
    }
}

响应结果定义

定义统一返回格式

package com.demo.autotest.dto;

import com.demo.autotest.common.constant.ResponseCode;
import lombok.Data;

@Data
public class ResponseDTO<T> {

    private int status;

    private String message;

    private int code;

    private T data;

    public ResponseDTO(T data) {
        this(ResponseCode.SUCCESS, data);
    }

    public ResponseDTO(ResponseCode resultCode, T data) {
        this.status = resultCode.getStatus();
        this.code = this.status;
        this.message = resultCode.getMessage();
        this.data = data;
    }
}

定义统一请求状态

package com.demo.autotest.common.constant;

import lombok.Getter;

@Getter
public enum ResponseCode {
    SUCCESS(0, "成功"),

    FAILED(1000, "失败"),

    EXPIRED_ERROR(1001, "token过期错误"),

    DECODE_ERROR(1002, "token解析错误");

    private final int status;
    private final String message;

    ResponseCode(int status, String message) {
        this.status = status;
        this.message = message;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值