springCloud统一响应、全局异常处理
���录
()1.父工程pom
2.全局异常捕获pom依赖
()3.注解类
4.定义统一响应拦截
5.统一响应类
6.全局异常捕获类
7.使用
1.父工程pom
Hoxton.SR8 2.2.4.RELEASE org.projectlombok lombok 1.16.18 org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-actuator org.apache.commons commons-lang3 3.11 org.apache.commons commons-collections4 4.4 cn.hutool hutool-all 5.6.0 io.jsonwebtoken jjwt-api 0.10.5 io.jsonwebtoken jjwt-impl 0.10.5 runtime io.jsonwebtoken jjwt-jackson 0.10.5 runtime com.alibaba fastjson 1.2.47 org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies ${spring-cloud-alibaba.version} pom import spring-milestones Spring Milestones https://repo.spring.io/milestone false
2.全局异常捕获pom依赖
org.springframework.boot spring-boot-starter-web
3.注解类
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 忽略统一相应注解定义:使用该注解的类和方法忽略统一响应 */ @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface IgnoreResponseAdvice { }
4.定义统一响应拦截
import xx.xx.IgnoreResponseAdvice; import xx.xx.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.ResponseBody; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; /** * 实现统一响应 */ @RestControllerAdvice(value = {"xx.xxx"}) public class CommonResponseDataAdvice implements ResponseBodyAdvice { /** * 判断是否需要对相应处理 * @param methodParameter * @param aClass * @return */ @Override @SuppressWarnings("all") public boolean supports(MethodParameter methodParameter, Class> aClass) { //判断是否需要对响应数据进行处理 //类 if(methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreResponseAdvice.class)){ return false; } //方法 if(methodParameter.getMethod().isAnnotationPresent(IgnoreResponseAdvice.class)){ return false; } //为true beforeBodyWrite 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> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { //定义最终返回对象 CommonResponse response = new CommonResponse(200,""); if(null == o){ return response; }else if(o instanceof CommonResponse){ response=(CommonResponse) o; return response; }else{ //将o设置为返回对象中的o response.setData(o); } return response; } }
5.统一响应类
package xx.xx.vo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; /** * 通用相应对象定义 * { * "code":200, * "msg":"", * "data":{} * } */ @Data //无参构造函数 @NoArgsConstructor //有参构造函数 @AllArgsConstructor public class CommonResponse implements Serializable { /** * 错误码 */ private Integer code; /** * 错误信息 */ private String msg; /** * 泛型响应数据 */ private T data; public CommonResponse(Integer code, String msg) { this.code = code; this.msg = msg; } }
6.全局异常捕获类
package xx.xx.advice; import xx.xx.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 { /** * Exception.class 捕获的class类型 * @param req * @param ex * @return */ @ExceptionHandler(value = Exception.class) public CommonResponse handlerCommerceException(HttpServletRequest req, Exception ex) { CommonResponse response = new CommonResponse(-1,"business error"); response.setData(ex.getMessage()); log.error("commerce service has error:[{}]",ex.getMessage(),ex); return response; } }
7.使用
在web项目中引入该依赖即可,注意包名 XX.xx cloud-mvc-config 1.0-SNAPSHOT
The End