由于参加活动,不好直接将pom文件代码贴出在上一篇文章中,所以放在这里了,请大家见谅,有需要的朋友们可以参考一下,后续也会放到GitHub、gitee上。
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>e-commerce-springcloud</artifactId>
<groupId>com.sheep.ecommerce</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>e-commerce-mvc-config</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 模块名及描述信息 -->
<name>e-commerce-mvc-config</name>
<description>通用配置模块</description>
<dependencies>
<!-- 引入 Web 功能 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.sheep.ecommerce</groupId>
<artifactId>e-commerce-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
实现统一响应(CommonResponseDataAdvice)
package com.sheep.ecommerce.advice;
import com.sheep.ecommerce.annotation.IgnoreResponseAdvice;
import com.sheep.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;
/**
* <h1>实现统一响应</h1>
* */
@RestControllerAdvice(value = "com.sheep.ecommerce")
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> {
/**
* <h2>判断是否需要对响应进行处理</h2>
* */
@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;
}
/**
* 包装返回对象
*/
@Override
@SuppressWarnings("all")
public Object beforeBodyWrite(Object o, MethodParameter methodParameter,
MediaType mediaType,
Class<? extends HttpMessageConverter<?>> aClass,
ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
// 定义最终的返回对象
CommonResponse<Object> response = new CommonResponse<>(0, "");
// 如果响应为空
if (null == o) {
return response;
} else if (o instanceof CommonResponse) {
//如果响应就是CommonResponse也不需要处理
response = (CommonResponse<Object>) o;
} else {
response.setData(o);
}
return response;
}
}
全局异常捕获处理(GlobalExceptionAdvice)
package com.sheep.ecommerce.advice;
import com.sheep.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;
/**
* <h2>全局异常捕获处理</h2>
* */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionAdvice {
@ExceptionHandler(value = Exception.class)
public CommonResponse<String> handlerCommerceException(
HttpServletRequest req, Exception ex
) {
CommonResponse<String> response = new CommonResponse<>(
-1, "business error"
);
response.setData(ex.getMessage());
log.error("commerce service has error: [{}]", ex.getMessage(), ex);
return response;
}
}
忽略统一响应注解定义(IgnoreResponseAdvice)
package com.sheep.ecommerce.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* <h1>忽略统一响应注解定义</h1>
* */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreResponseAdvice {
}