继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【九月打卡】第7天 设计电商工程,把握全局视角

两只角的蜗牛
关注TA
已关注
手记 25
粉丝 2
获赞 4

课程名称:Spring Cloud / Alibaba 微服务架构实战

课程章节:第3章-设计电商工程,把握全局视角

课程讲师:张勤一

课程内容:

1. 构建统一响应格式

package com.imooc.ecommerce.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 通用响应对象的定义
 * {
 *     "cdoe": 0,
 *     "message": "",
 *     "data": {}
 * }
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommonResponse<T> implements Serializable {

    /**
     * 响应状态码
     */
    private Integer code;

    /**
     * 响应提示语
     */
    private String message;

    /**
     * 响应数据
     */
    private T Data;

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


}
package com.imooc.ecommerce.annotation;


import java.lang.annotation.*;

/**
 * 忽略统一响应注解定义
 * 有些接口不需要使用统一的响应格式
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreResponseAdvice {

}
package com.imooc.ecommerce.advice;

import com.imooc.ecommerce.annotation.IgnoreResponseAdvice;
import com.imooc.ecommerce.vo.CommonResponse;
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.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * 实现统一响应
 */
@RestControllerAdvice(value = "com.imooc.ecommerce")
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> {

    /**
     * 判断是否需要对响应进行处理
     * 默认不处理 false
     * @param methodParameter
     * @param aClass
     * @return
     */
    @Override
    @SuppressWarnings("all")
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        /**
         * 如果类被@IgnoreResponseAdvice标识,则该类中的所有方法的响应不用统一处理。
         */
        if (methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreResponseAdvice.class)){
            return false;
        }

        /**
         * 如果方法被@IgnoreResponseAdvice标识,则这个方法的响应不用统一处理。
         */
        if (methodParameter.getMethod().isAnnotationPresent(IgnoreResponseAdvice.class)){
            return false;
        }

        return true;
    }

    /**
     * 在响应数据之前对数据进行封装
     * @param o 封装好的数据对象
     * @param methodParameter
     * @param mediaType
     * @param aClass
     * @param serverHttpRequest
     * @param serverHttpResponse
     * @return
     */
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter,
                                  MediaType mediaType,
                                  Class<? extends HttpMessageConverter<?>> aClass,
                                  ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {

        //1. 创建封装对象
        CommonResponse<Object> response = new CommonResponse<>(0, "");
        //2.判断数据对象是否为空,为空就返回数据为空的封装对象
        if (null == o){
            return response;
        }else if (o instanceof CommonResponse){//如果数据对象就是CommonResponse类型,直接返回
            return o;
        }else { //如果数据对象没有封装,就封装到封装对象的data中。
            response.setData(o);
        }
        return response;
    }
}

2. 构建统一异常格式

package com.imooc.ecommerce.advice;

import com.imooc.ecommerce.vo.CommonResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;

/**
 * 全局异常捕获处理
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionAdvice {

    /**
     * @ExceptionHandler
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public CommonResponse<String> handlerCommerceException(HttpServletRequest request, Exception e){
        CommonResponse<String> response = new CommonResponse<>(-1, "business error");
        response.setData(e.getMessage());
        log.error("================>commerce service has error: [{}]", e.getMessage(), e);
        return response;
    }

}

课程截图:


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP