我搞不懂为什么要观察方法调用的不同输出,这取决于是否包含了额外的库。
在解析Swaggerv1.2Doc时,我观察到了不同的结果,不管有没有swagger-compat-spec-parser
库。
注意,在下面的输出中,我运行Scala编程语言的REPL。
将Swagger文档解析为无null
swagger-compat-spec-parser
库的库
$cat build.sbt
libraryDependencies += "io.swagger" % "swagger-parser" % "1.0.17"
$sbt console
scala> import io.swagger.parser.SwaggerParser
import io.swagger.parser.SwaggerParser
scala> "/Users/Kevin/Workspace/project/src/test/resources/api-docs-swagger-v1.2"
res0: String = /Users/Kevin/Workspace/project/src/test/resources/api-docs-swagger-v1.2
scala> new SwaggerParser().read(res0)
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
reading from /Users/Kevin/Workspace/project/src/test/resources/api-docs-swagger-v1.2
reading from /Users/Kevin/Workspace/project/src/test/resources/api-docs-swagger-v1.2
res1: io.swagger.models.Swagger = null
使用swagger-compat-spec-parser
库将 Swagger Doc解析为非空结果
$cat build.sbt
libraryDependencies += "io.swagger" % "swagger-parser" % "1.0.17"
libraryDependencies += "io.swagger" % "swagger-compat-spec-parser" % "1.0.17"
$sbt console
scala> import io.swagger.parser.SwaggerParser
import io.swagger.parser.SwaggerParser
scala> "/Users/Kevin/Workspace/project/src/test/resources/api-docs-swagger-v1.2"
res0: String = /Users/Kevin/Workspace/project/src/test/resources/api-docs-swagger-v1.2
scala> new SwaggerParser().read(res0)
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
reading from /Users/Kevin/Workspace/project/src/test/resources/api-docs-swagger-v1.2
reading from /Users/Kevin/Workspace/project/src/test/resources/api-docs-swagger-v1.2
res1: io.swagger.models.Swagger = io.swagger.models.Swagger@5876ed9a
为什么相同类的read
方法会因是否存在另一个依赖项而有所不同?
发布于 2016-02-20 09:30:56
这和Swagger有关。
行为是可以的,甚至可能没有文档化(至少在源代码中没有)。看看https://github.com/swagger-api/swagger-parser/blob/master/modules/swagger-parser/src/main/java/io/swagger/parser/SwaggerParser.java#L55
更准确地说,在第64行,Swagger读取位置,但只有当它是URL。
因此,您的示例将一直运行到使用扩展的第72行。扩展通过第60行的getExtensions()提供(第169号行的定义)。
如您所见,它们是通过ServiceLoader在运行时加载的,即当不提供任何解析时:)
希望这能澄清你的行为。但是,您可以测试您的第二个示例,将Swagger指向没有存在的文件,以查看它在哪里爆炸,您将得到:
scala> "/Users/IMNotKevin/Thus/Api/Does/Not/Exist"
res0: String = /Users/IMNotKevin/Thus/Api/Does/Not/Exist
scala> new SwaggerParser().read(res0)
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
reading from /Users/IMNotKevin/Thus/Api/Does/Not/Exist
reading from /Users/IMNotKevin/Thus/Api/Does/Not/Exist
java.io.FileNotFoundException: /Users/IMNotKevin/Thus/Api/Does/Not/Exist (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:708)
at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:1861)
at io.swagger.parser.SwaggerCompatConverter.readResourceListing(SwaggerCompatConverter.java:139)
at io.swagger.parser.SwaggerCompatConverter.read(SwaggerCompatConverter.java:74)
at io.swagger.parser.SwaggerParser.read(SwaggerParser.java:73)
at io.swagger.parser.SwaggerParser.read(SwaggerParser.java:52)
享受:)
发布于 2016-02-21 06:21:46
@Teliakto是正确的。根据自述文件,如果要加载1.2规范,则必须加载swagger-compat-spec-parser
。这是通过SPI完成的。
https://stackoverflow.com/questions/35512559
复制相似问题