一、问题发现
一个新的项目在本地启动的时候,控制台有很多这样的提示信息:
虽然不影响系统正常运行,但作为一个有代码洁癖的人自然忍不了这样的警示信息,这个是swagger包下的日志信息,其中有一个ApiImplicitParams
注解。
二、问题解决
在所有使用这个注解的地方,增加一个属性dataTypeClass = String.class
比如: @ApiImplicitParam(name = "page", value = "页码")
改为@ApiImplicitParam(name = "page", value = "页码", dataTypeClass = String.class)
,都加完之后,这样的提示信息就不没有了。
三、问题探究
说完了解决方案,那来说一下为啥增加了dataTypeClass = String.class
就可以解决这个问题了。
首先我们先看下这个字段dataTypeClass
的定义:
dataTypeClass
的默认值是Void.class
,这个字段的上面有行注释:Overrides dataType if provided.
翻译成中文的意思就是:如果提供(自定义)了 dataTypeClass
字段的值,就会覆盖掉提供的dataType的值,初次只看这句注释并不太懂是什么意思,直到我回到控制台打印的日志的信息,找到这行日志是在OperationImplicitParameterReader
类中打印出来的,进入到这个类中,搜索关键的日志信息并看到对应的代码才明白这句话的意思,搜索日志中的这句话:
Unable to interpret the implicit parameter configuration with dataType
在这个方法中的164行到168行之间很明显可以看出问题,当param.dataTypeClass() == Void.class
则执行Class.forName(param.dataType());
对参数属性中的dataType
的类进行加载,当ApiImplicitParam
注解中也没有dataType
字段值的时候,加载的时候就会出现ClassNotFoundException
的异常信息,然后就会报这个警告提示。
当我们把dataTypeClass
的值从默认的Void.class
改为非Void.class
的,那就会走第一个if块,加载的类就是我们自定义的class了:
比如:@ApiImplicitParam(name = "page", value = "页码", dataTypeClass = String.class)
中的String.class
。
至于什么时候会加载ApiImplicitParam
这个注解,就需要自己去探寻了,我这里定位到了这个方法,OperationImplicitParameterReader.readParameters
中的context.findAnnotation(ApiImplicitParam.class);
这行代码。
剩下的如果感兴趣可以自行去发现宝藏哦~
---------知道的越多,不知道的越多---------------