【九月打卡】第7天 设计电商工程,把握全局视角
课程名称:Spring Cloud / Alibaba 微服务架构实战
课程章节:第3章-设计电商工程,把握全局视角
课程讲师:张勤一
课程内容:
- 电商工程的第一行代码3-3 电商工程的第一行代码_慕课网 (imooc.com)
- 工程通用与配置两大基础模块(上,下)
- 3-4 工程通用与配置两大基础模块(上)_慕课网 (imooc.com)
- 3-5 工程通用与配置两大基础模块(下)_慕课网 (imooc.com)
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;
}
}
课程截图:
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦