jetplugins / apidocx

Generate API documents to any place: YApi, RAP2, Eolink, etc.
https://plugins.jetbrains.com/plugin/17425-apidocx/
Apache License 2.0
178 stars 40 forks source link

feat:建议导出接口支持 ResponseBodyAdvice 统一返回配置 #52

Closed lunfangyu closed 1 year ago

lunfangyu commented 1 year ago

为了代码简洁,通常springboot项目都会实现org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice<T> 这个类去做统一响应处理。例如:

/**
 * 统一响应结果
 */
@Data
public class Result<T> implements Serializable {
    private static final long serialVersionUID = 8925927757015090232L;
    /** 响应编码 */
    private String code;
    /** 响应消息 */
    private String msg;
    /** 响应数据 */
    private T data;
}

/**
 * 统一处理响应结果
 * 处理后,不需要在Controller层的每个接口返回结果再包一层Result<T>
 */
@Slf4j
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {
        if (body instanceof Result) {
            return body;
        }
        return Result.success(body);
    }
}

/**
 * 测试实体类
 */
@Data
public class TestDTO implements Serializable {
    private static final long serialVersionUID = -5026639589154791246L;
    /** 
     * 名称
     * */
    private String name;
    /**
     * 性别
     */
    private String gender;
}

@Slf4j
@Validated
@RestController
@RequestMapping("test")
public class TestController {
    /**
     * 测试接口
     * @return 结果对象
     */
    @GetMapping
    public TestDTO test(){
        TestDTO entity = new TestDTO();
        entity.setGender("男");
        return entity;
    }
}

经过统一处理,接口test()最终返回结果如下:

{
  "code": "00000",
  "msg": "成功",
  "data": {
    "name": "名称",
    "gender": "男"
  }
}

理论上对应的接口文档响应结果字段应该是这样的:

名称 类型 是否必须 备注 其他信息
code string 非必须 响应编码
msg string 非必须 响应消息
data object 非必须 响应数据 备注: 响应数据
name string 非必须 名称
gender string 非必须 性别

但是实际只生成了如下文档:

名称 类型 是否必须 备注 其他信息
name string 非必须 名称
gender string 非必须 性别

因此建议插件增加一个结果类型(Result)配置开关,如果开启并配置了这个Result类,当扫描接口返回结果类型时,如果类型是Result类,则直接生成文档;如果不是,则包上这一层Result类,再生成接口文档。 这样,才不会生成错误的接口文档。

lkqm commented 1 year ago

目前是支持该功能的,项目下配置文件.yapix中配置项returnWrapType 指定类限定名即可,更多配置项项可见 readme文档

lunfangyu commented 1 year ago

目前是支持该功能的,项目下配置文件.yapix中配置项returnWrapType 指定类限定名即可,更多配置项项可见 readme文档

非常感谢!我试试