相同 Class 的不同行为取决于依赖项?
Different Behavior for Same Class depending on Dependencies?
我很困惑为什么我会根据是否包含其他库来观察方法调用的不同输出。
在使用和不使用 swagger-compat-spec-parser
库的情况下解析 Swagger v1.2 文档时,我观察到不同的结果。
请注意,在以下输出中,我是 运行 Scala 编程语言的 REPL。
在没有 swagger-compat-spec-parser
库的情况下将 Swagger Doc 解析为 null
$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
为什么相同的(我假设)class 的 read
方法会根据是否存在另一个依赖项而有所不同?
这与 Swagger 相关。
行为还可以,甚至可能没有记录(至少没有在源代码中)。看看https://github.com/swagger-api/swagger-parser/blob/master/modules/swagger-parser/src/main/java/io/swagger/parser/SwaggerParser.java#L55
更准确地说,在 Swagger 读取位置的第 64 行,但仅限于 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)
尽情享受吧:)
@Teliakto 是正确的。根据 README,如果您想加载 1.2 规范,则必须加载 swagger-compat-spec-parser
。这是通过 SPI 完成的。
我很困惑为什么我会根据是否包含其他库来观察方法调用的不同输出。
在使用和不使用 swagger-compat-spec-parser
库的情况下解析 Swagger v1.2 文档时,我观察到不同的结果。
请注意,在以下输出中,我是 运行 Scala 编程语言的 REPL。
在没有 swagger-compat-spec-parser
库的情况下将 Swagger Doc 解析为 null
$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
为什么相同的(我假设)class 的 read
方法会根据是否存在另一个依赖项而有所不同?
这与 Swagger 相关。
行为还可以,甚至可能没有记录(至少没有在源代码中)。看看https://github.com/swagger-api/swagger-parser/blob/master/modules/swagger-parser/src/main/java/io/swagger/parser/SwaggerParser.java#L55
更准确地说,在 Swagger 读取位置的第 64 行,但仅限于 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)
尽情享受吧:)
@Teliakto 是正确的。根据 README,如果您想加载 1.2 规范,则必须加载 swagger-compat-spec-parser
。这是通过 SPI 完成的。