接口的请求参数对象中,部分属性是由后端填充的,所以希望在接口api文档中把这些入参隐藏掉。
为了解决上面提到的两个问题,我的第一反应是去网上查资料。但是找了一圈,也没有找到现成的解决方法。故而通过参考knife4j的某些扩展方式自己实现,并把自己的实现方法分享出来,以便有类似需求的小伙儿参考。
第2个问题其实knife4j的@ApiOperationSupport注解也能实现隐藏请求参数的效果,但是呢它有一个缺陷(或者说是bug),那就是一旦给方法加上该注解之后,如果请求参数中存在嵌套的对象,那么文档中生成的请求示例将会缺少部分参数。
通过springfox的扩展机制,利用javassist动态创建类的方式来替换原接口的响应参数或请求参数对应的类
用到的扩展点如下:
springfox.documentation.spi.service.OperationBuilderPlugin
springfox.documentation.spi.service.ParameterBuilderPlugin
springfox.documentation.spi.service.OperationModelsProviderPlugin
利用以下两种注解提供接口的响应类型,兼容v2/v3
io.swagger.v3.oas.annotations.responses.ApiResponse
io.swagger.v3.oas.annotations.responses.ApiResponses
io.swagger.annotations.ApiResponses
io.swagger.annotations.ApiResponse
利用自定义注解来提供需要隐藏的参数信息
响应结果只能通过将状态码定义为类似200-1这种方式,因为所有状态都定义为200,则只会展示一种结果,就达不到目的了。当然这也算是这种解决方式的一个缺陷吧,但总归时实现了将所有响应类型的属性文档均展示出来了,更加方便对接的同学开发使用
import java.util.Set;
import java.util.function.Consumer;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.LoaderClassPath;
import javassist.Modifier;
import javassist.NotFoundException;
import javassist.bytecode.AnnotationsAttribute;
import javassist.bytecode.ClassFile;
import javassist.bytecode.ConstPool;
import javassist.bytecode.FieldInfo;
import javassist.bytecode.annotation.Annotation;
import javassist.bytecode.annotation.AnnotationMemberValue;
import javassist.bytecode.annotation.ArrayMemberValue;
import javassist.bytecode.annotation.BooleanMemberValue;
import javassist.bytecode.annotation.ByteMemberValue;
import javassist.bytecode.annotation.CharMemberValue;
import javassist.bytecode.annotation.ClassMemberValue;
import javassist.bytecode.annotation.DoubleMemberValue;
import javassist.bytecode.annotation.EnumMemberValue;
import javassist.bytecode.annotation.FloatMemberValue;
import javassist.bytecode.annotation.IntegerMemberValue;
import javassist.bytecode.annotation.LongMemberValue;
import javassist.bytecode.annotation.MemberValueVisitor;
import javassist.bytecode.annotation.ShortMemberValue;
import javassist.bytecode.annotation.StringMemberValue;
import lombok.extern.slf4j.Slf4j;
* javassist工具类
@Slf4j
public class JavassistUtil {
private static volatile ClassPool classPool;