我正在尝试为其API被描述为OpenAPI文件(https://developer.loadsmart.com/api/openapi.yaml)的服务生成服务器存根,我正试图使用openapi生成器(https://github.com/OpenAPITools/openapi-generator)来实现这一点。
检出以前版本的存储库(3.3.4)时,我可以这样验证api文件:
$ java -jar openapi-generator-cli-3_3_4.jar validate -i api.yaml
Validating spec (api.yaml)
No validation issues detected.当使用4.3.1版本的存储库(我相信是最新的4.x分支版本)时,API文件不再验证:
$ java -jar openapi-generator-cli-4_3_1.jar validate -i api.yaml
Validating spec (api.yaml)
[main] ERROR i.s.parser.SwaggerCompatConverter - failed to read resource listing
com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'openapi': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: (StringReader); line: 1, column: 8]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1840)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:722)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:2868)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:1914)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:773)
at com.fasterxml.jackson.databind.ObjectMapper._readTreeAndClose(ObjectMapper.java:4231)
at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:2711)
at io.swagger.parser.SwaggerCompatConverter.readResourceListing(SwaggerCompatConverter.java:210)
at io.swagger.parser.SwaggerCompatConverter.read(SwaggerCompatConverter.java:123)
at io.swagger.parser.SwaggerCompatConverter.readWithInfo(SwaggerCompatConverter.java:94)
at io.swagger.parser.SwaggerParser.readWithInfo(SwaggerParser.java:42)
at io.swagger.v3.parser.converter.SwaggerConverter.readLocation(SwaggerConverter.java:89)
at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
at org.openapitools.codegen.cmd.Validate.execute(Validate.java:52)
at org.openapitools.codegen.cmd.OpenApiGeneratorCommand.run(OpenApiGeneratorCommand.java:32)
at org.openapitools.codegen.OpenAPIGenerator.main(OpenAPIGenerator.java:61)
[main] ERROR i.s.parser.SwaggerCompatConverter - failed to read resource listing
com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'openapi': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: (StringReader); line: 1, column: 8]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1840)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:722)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:2868)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:1914)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:773)
at com.fasterxml.jackson.databind.ObjectMapper._readTreeAndClose(ObjectMapper.java:4231)
at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:2711)
at io.swagger.parser.SwaggerCompatConverter.readResourceListing(SwaggerCompatConverter.java:210)
at io.swagger.parser.SwaggerCompatConverter.read(SwaggerCompatConverter.java:123)
at io.swagger.parser.SwaggerCompatConverter.readWithInfo(SwaggerCompatConverter.java:94)
at io.swagger.parser.SwaggerParser.readWithInfo(SwaggerParser.java:42)
at io.swagger.v3.parser.converter.SwaggerConverter.readLocation(SwaggerConverter.java:89)
at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
at org.openapitools.codegen.cmd.Validate.execute(Validate.java:52)
at org.openapitools.codegen.cmd.OpenApiGeneratorCommand.run(OpenApiGeneratorCommand.java:32)
at org.openapitools.codegen.OpenAPIGenerator.main(OpenAPIGenerator.java:61)
Exception in thread "main" java.lang.NullPointerException
at java.util.HashSet.<init>(HashSet.java:119)
at org.openapitools.codegen.cmd.Validate.execute(Validate.java:54)
at org.openapitools.codegen.cmd.OpenApiGeneratorCommand.run(OpenApiGeneratorCommand.java:32)
at org.openapitools.codegen.OpenAPIGenerator.main(OpenAPIGenerator.java:61)最后,当使用5.0版本(5.0.0或5.0.1)时,API文件似乎有额外的验证问题:
java -jar openapi-generator-cli-5_0_0.jar validate -i api.yaml
Validating spec (api.yaml)
Errors:
- attribute
paths.'/api/v2/load-offers/offers/{offer_id}/related'(get).responses.200.content.'application/json'.schema.items
is missing
- attribute
paths.'/api/v2/matches/{match_id}/reject'(post).responses.200.content.'application/json'.schema.items
is missing
- attribute
paths.'/api/v2/matches/{match_id}/accept'(post).responses.200.content.'application/json'.schema.items
is missing
- attribute
paths.'/api/v2/load-offers/loads/'(get).responses.200.content.'application/json'.schema.items
is missing
- attribute
paths.'/api/v2/matches/'(get).responses.200.content.'application/json'.schema.items is
missing
- attribute
paths.'/api/v2/load-offers/loads/{load_id}'(get).responses.200.content.'application/json'.schema.items
is missing
- attribute
paths.'/api/v2/load-offers/loads/{load_id}/related-offers'(get).responses.200.content.'application/json'.schema.items
is missing
- attribute paths.'/api/v2/carrier/{driver_id}'. Declared path parameter driver_id needs to
be defined as a path parameter in path or operation level
- attribute paths.'/api/v2/shippers/accounts/{account_id}'. Declared path parameter
account_id needs to be defined as a path parameter in path or operation level
- attribute
paths.'/api/v2/shipments/{shipment_id}/appointment_suggestions?start_date={start_date}'.
Declared path parameter shipment_id needs to be defined as a path parameter in path or
operation level
- attribute paths.'/api/v2/load-offers/offers/{offer_id}'. Declared path parameter offer_id
needs to be defined as a path parameter in path or operation level
- attribute paths.'/api/v2/intermodal/quotes/{batch_id}'. Declared path parameter batch_id
needs to be defined as a path parameter in path or operation level
- attribute
paths.'/api/v2/load-offers/offers/{offer_id}'(get).responses.200.content.'application/json'.schema.items
is missing
- attribute paths.'/api/v2/capacity/{capacity_ref_number}'. Declared path parameter
capacity_ref_number needs to be defined as a path parameter in path or operation level
- attribute
paths.'/api/v2/load-offers/offers'(get).responses.200.content.'application/json'.schema.items
is missing
- attribute paths.'/api/v2/shipments/{shipment_id}'. Declared path parameter shipment_id
needs to be defined as a path parameter in path or operation level
Warnings:
- Unused model: PhoneNumber
- Unused model: EquipmentType
- Unused model: TotalWidth
- Unused model: TotalLength
- Unused model: TotalHeight
- Unused model: Requirements
- Unused model: ShipmentMode
[error] Spec has 16 errors.我试图理解为什么在新版本的openapi生成器中引入了更严格的验证,而没有任何明显的选项来更新旧文件。我使用的api.yaml文件的OpenAPI规范版本是3.0.1。我已经尝试在OpenAPI和Swagger网站上寻找任何线索,以便在不同版本的openapi-generator之间进行更改,但我没有找到任何非常有帮助的东西。
发布于 2021-02-10 04:05:14
我能够重现它。
This commit是引入这一变化的人,它链接到this issue:

问题是validate与generate的行为方式并不相同,因此他们引入了相同类型的验证。
有关更多详细信息,validate命令现在执行以下调用
SwaggerParseResult result = new OpenAPIParser().readLocation(spec, null, options);https://stackoverflow.com/questions/66125042
复制相似问题