2016-02-19 154 views
0

我很困惑,为什么我会根据是否包含附加库来观察方法调用的不同输出。取决于相关性的相同类的不同行为?

我在分析Swagger v1.2 Doc时使用和不使用swagger-compat-spec-parser库时观察到不同的结果。

请注意,在下面的输出中,我正在运行Scala编程语言的REPL。

解析扬鞭文件到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

$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 = [email protected] 

为什么会产生相同的(我相信)类的read方法取决于是否存在其他依赖关系?

+2

完整的具体问题应该在这里发布。 –

回答

1

这是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行。这些扩展是通过getExtensions()在第60行(定义在第169行)提供的。

正如你可以看到他们通过的ServiceLoader在运行时加载,即在不提供任何解析:)

。希望清除的行为。但是,你可以测试你的第二个例子指着扬鞭不存在的文件,看看它吹灭,你会得到:

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) 

享受:)

1

@Teliakto是正确的。根据README,如果您要加载1.2规范,则必须加载swagger-compat-spec-parser。这是通过SPI完成的。

相关问题