一.引入swagger2相应的maven依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.38</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>
二.配置swagger
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.gdz.log.controller"))
.paths(PathSelectors.any())
.build();
return docket;
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("API")
.description("新增用户")
.version("1.0.0")
.build();
}
}
三.新建日志切面
/**
* @Author: guandezhi
* @Date: 2019/3/5 21:17
*/
@Slf4j
@Aspect
@Component
public class WebLogAspect {
private final ThreadLocal<String> methodDescribe = new ThreadLocal<>();
@Pointcut("execution(public * com.gdz.log.controller..*.*(..))")
public void webLog() {
}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
recordMethodLog(joinPoint, getRequestContext());
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
log.info(methodDescribe.get() + "返回参数 : {}", JSONObject.toJSONString(ret));
methodDescribe.remove();
}
private HttpServletRequest getRequestContext() {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
return attributes.getRequest();
}
private void recordMethodLog(JoinPoint joinPoint, HttpServletRequest request) {
Method method = getMethod(joinPoint);
ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);
String value = "";
if (null != apiOperation) {
value = apiOperation.value();
if (StringUtils.isNotEmpty(value)) {
methodDescribe.set(value);
}
}
log.info(value + "入参:{} ", parseArgs(joinPoint));
}
private Method getMethod(JoinPoint joinPoint) {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
return methodSignature.getMethod();
}
private String parseArgs(JoinPoint joinPoint) {
StringBuffer sb = new StringBuffer();
Object[] args = joinPoint.getArgs();
if (args != null) {
for (Object arg : args) {
if (arg instanceof BindingResult ||
arg instanceof HttpServletRequest ||
arg instanceof HttpServletResponse ||
arg instanceof MultipartFile ||
arg instanceof MultipartFile[]) {
continue;
}
sb.append(" ");
sb.append(JSONObject.toJSONString(arg));
}
}
return sb.toString();
}
}
四.测试一下
/**
* @Author: guandezhi
* @Date: 2019/3/5 21:01
*/
@Api(tags = "用户管理")
@RestController
@RequestMapping("/user")
public class UserController {
@ApiOperation(value = "新增用户")
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public Result<Object> adUser(@RequestBody AddUserRequest request) {
Result resultVo = new Result();
resultVo.setCode(200);
resultVo.setMessage("success");
resultVo.setData(request);
return resultVo;
}
}
效果如下图,(找bug,定位问题特别实用):
swagger-ui图:
注意:入参转为json格式时千万不要这么写(JSONObject.toJSONString(joinPoint.getArgs()) ),在遇HttpServletRequest这些不能转为json时会报错,网上基本都是这么写的,都是学院派做法,给自己挖坑了。