如何解决使用 openapi-generator 解析错误类型的无效类型,将其设置为字符串
我有以下 openapi 文件架构
{
"openapi": "3.0.3","info": {
"title": "Hyperledger Cactus Plugin - Connector Quorum","description": "Can perform basic tasks on a Quorum ledger","version": "0.0.1"
},"servers": [
{
"url": "https://www.cactus.stream/{basePath}","description": "Public test instance","variables": {
"basePath": {
"default": ""
}
}
},{
"url": "http://localhost:4000/{basePath}","description": "Local test instance","variables": {
"basePath": {
"default": ""
}
}
}
],"components": {
"schemas": {
"Web3SigningCredential": {
"type": "object","required": [
"type"
],"discriminator": {
"propertyName": "type"
},"oneOf": [
{
"$ref": "#/components/schemas/Web3SigningCredentialGethKeychainPassword"
},{
"$ref": "#/components/schemas/Web3SigningCredentialCactusKeychainRef"
},{
"$ref": "#/components/schemas/Web3SigningCredentialPrivateKeyHex"
},{
"$ref": "#/components/schemas/Web3SigningCredentialNone"
}
],"properties": {
"type": {
"$ref": "#/components/schemas/Web3SigningCredentialType"
}
}
},"Web3SigningCredentialGethKeychainPassword": {
"type": "object","required": [
"type","ethAccount","secret"
],"properties": {
"type": {
"$ref": "#/components/schemas/Web3SigningCredentialType"
},"ethAccount": {
"type": "string","description": "The ethereum account (public key) that the credential belongs to. Basically the username in the traditional terminology of authentication.","minLength": 64,"maxLength": 64,"nullable": false
},"secret": {
"type": "string","description": "A geth keychain unlock password.","minLength": 0,"maxLength": 65535
}
}
},"Web3SigningCredentialCactusKeychainRef": {
"type": "object","keychainId","keychainEntryKey"
],"description": "The ethereum account (public key) that the credential belongs to. Basically the username in the traditional terminology of authentication.","keychainEntryKey": {
"type": "string","description": "The key to use when looking up the the keychain entry holding the secret pointed to by the keychainEntryKey parameter.","maxLength": 1024
},"keychainId": {
"type": "string","description": "The keychain ID to use when looking up the the keychain plugin instance that will be used to retrieve the secret pointed to by the keychainEntryKey parameter.","maxLength": 1024
}
}
},"Web3SigningCredentialPrivateKeyHex": {
"type": "object","description": "The ethereum account (public key) that the credential belongs to. Basically the username in the traditional terminology of authentication.","description": "The HEX encoded private key of an eth account.","Web3SigningCredentialNone": {
"type": "object","description": "Using this denotes that there is no signing required because the transaction is pre-signed.","Web3SigningCredentialType": {
"type": "string","enum": [
"CACTUS_KEYCHAIN_REF","GETH_KEYCHAIN_PASSWORD","PRIVATE_KEY_HEX","NONE"
]
},"EthContractInvocationType": {
"type": "string","enum": [
"SEND","CALL"
]
},"SolidityContractJsonArtifact": {
"type": "object","required": [
"contractName"
],"properties": {
"contractName": {
"type": "string","metadata": {
"type": "string","bytecode": {
"type": "string","deployedBytecode": {
"type": "string","sourceMap": {
"type": "string","deployedSourceMap": {
"type": "string","sourcePath": {
"type": "string"
},"compiler": {
"type": "object","additionalProperties": true,"properties": {
"name": {
"type": "string"
},"version": {
"type": "string"
}
}
},"functionHashes": {
"type": "object","additionalProperties": true
},"gasEstimates": {
"properties": {
"creation": {
"type": "object","properties": {
"codeDepositCost": {
"type": "string"
},"executionCost": {
"type": "string"
},"totalCost": {
"type": "string"
}
}
},"external": {
"type": "object","additionalProperties": true
}
}
}
}
},"QuorumTransactionConfig": {
"type": "object","required": [],"properties": {
"rawTransaction": {
"type": "string","from": {
"oneOf": [
{
"type": "string"
},{
"type": "number"
}
]
},"to": {
"oneOf": [
{
"type": "string"
}
]
},"value": {
"oneOf": [
{
"type": "string"
},"gas": {
"oneOf": [
{
"type": "string"
},"gasPrice": {
"oneOf": [
{
"type": "string"
},"data": {
"oneOf": [
{
"type": "string"
}
]
}
}
},"Web3TransactionReceipt": {
"type": "object","required": [
"blockHash","blockNumber","transactionHash","transactionIndex","status","from","to","gasUsed"
],"properties": {
"status": {
"type": "boolean","transactionHash": {
"type": "string","pattern": "/^0x([A-Fa-f0-9]{64})$/"
},"transactionIndex": {
"type": "number","blockHash": {
"type": "string","blockNumber": {
"type": "number","gasUsed": {
"type": "number","contractAddress": {
"type": "string","nullable": true
},"from": {
"type": "string","to": {
"type": "string","nullable": false
}
}
},"RunTransactionRequest": {
"type": "object","required": [
"web3SigningCredential","transactionConfig"
],"properties": {
"web3SigningCredential": {
"$ref": "#/components/schemas/Web3SigningCredential","transactionConfig": {
"$ref": "#/components/schemas/QuorumTransactionConfig","timeoutMs": {
"type": "number","description": "The amount of milliseconds to wait for a transaction receipt with thehash of the transaction(which indicates successful execution) beforegiving up and crashing.","minimum": 0,"default": 60000,"RunTransactionResponse": {
"type": "object","required": [
"transactionReceipt"
],"properties": {
"transactionReceipt": {
"$ref": "#/components/schemas/Web3TransactionReceipt"
}
}
},"DeployContractSolidityBytecodeV1Request": {
"type": "object","required": [
"bytecode","web3SigningCredential"
],"nullable": false,"minLength": 1,"maxLength": 24576,"description": "See https://ethereum.stackexchange.com/a/47556 regarding the maximum length of the bytecode"
},"gas": {
"type": "number","gasPrice": {
"type": "string","description": "The amount of milliseconds to wait for a transaction receipt with theaddress of the contract(which indicates successful deployment) beforegiving up and crashing.","DeployContractSolidityBytecodeV1Response": {
"type": "object","InvokeContractV1Request": {
"type": "object","required": [
"contractAbi","web3SigningCredential","contractAddress","invocationType","methodName","params"
],"contractAbi": {
"description": "The application binary interface of the solidity contract","type": "array","items": {},"invocationType": {
"$ref": "#/components/schemas/EthContractInvocationType","description": "Indicates wether it is a CALL or a SEND type of invocation where only SEND ends up creating an actual transaction on the ledger."
},"methodName": {
"description": "The name of the contract method to invoke.","type": "string","maxLength": 2048
},"params": {
"description": "The list of arguments to pass in to the contract method being invoked.","default": [],"items": {}
},"description": "The amount of milliseconds to wait for a transaction receipt beforegiving up and crashing. Only has any effect if the invocation type is SEND","InvokeContractV1Response": {
"type": "object","properties": {
"transactionReceipt": {
"$ref": "#/components/schemas/Web3TransactionReceipt"
},"callOutput": {}
}
}
}
},"paths": {
"/api/v1/plugins/@hyperledger/cactus-plugin-ledger-connector-quorum/deploy-contract-solidity-bytecode": {
"post": {
"operationId": "apiV1QuorumDeployContractSolidityBytecode","summary": "Deploys the bytecode of a Solidity contract.","parameters": [],"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DeployContractSolidityBytecodeV1Request"
}
}
}
},"responses": {
"200": {
"description": "OK","content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DeployContractSolidityBytecodeV1Response"
}
}
}
}
}
}
},"/api/v1/plugins/@hyperledger/cactus-plugin-ledger-connector-quorum/run-transaction": {
"post": {
"operationId": "apiV1QuorumRunTransaction","summary": "Executes a transaction on a quorum ledger","requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RunTransactionRequest"
}
}
}
},"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RunTransactionResponse"
}
}
}
}
}
}
},"/api/v1/plugins/@hyperledger/cactus-plugin-ledger-connector-quorum/invoke-contract": {
"post": {
"operationId": "apiV1QuorumInvokeContract","summary": "Invokeds a contract on a quorum ledger","requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InvokeContractV1Request"
}
}
}
},"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InvokeContractV1Response"
}
}
}
}
}
}
}
}
}
简而言之,架构(问题所在)就像
Web3SigningCredential -> { Web3SigningCredentialPrivateKeyHex、Web3SigningCredentialGethKeychainPassword、Web3SigningCredentialNone、Web3SigningCredentialCactusKeychainRef 之一 -> > Web3SigningCredentialType
当我尝试使用
解析它时openapi-generator generate --input-spec file_mentioned_above -g go -o some_path
我收到一个错误说明
Exception in thread "main" java.lang.RuntimeException: Could not process model 'Web3SigningCredential'.Please make sure that your schema is correct!
at org.openapitools.codegen.DefaultGenerator.generateModels(DefaultGenerator.java:477)
at org.openapitools.codegen.DefaultGenerator.generate(DefaultGenerator.java:852)
at org.openapitools.codegen.cmd.Generate.execute(Generate.java:432)
at org.openapitools.codegen.cmd.OpenApiGeneratorCommand.run(OpenApiGeneratorCommand.java:32)
at org.openapitools.codegen.OpenAPIGenerator.main(OpenAPIGenerator.java:66)
Caused by: java.lang.RuntimeException: 'Web3SigningCredential' defines discriminator 'type',but the referenced schema 'Web3SigningCredentialGethKeychainPassword' is incorrect. invalid type for type,set it to string
at org.openapitools.codegen.DefaultCodegen.getOneOfAnyOfDescendants(DefaultCodegen.java:2792)
at org.openapitools.codegen.DefaultCodegen.createDiscriminator(DefaultCodegen.java:2897)
at org.openapitools.codegen.DefaultCodegen.fromModel(DefaultCodegen.java:2249)
at org.openapitools.codegen.DefaultGenerator.processModels(DefaultGenerator.java:1162)
at org.openapitools.codegen.DefaultGenerator.generateModels(DefaultGenerator.java:472)
但是当我在上面提到的命令中使用语言 typescript-axios
时,同样的工作
openapi-generator generate --input-spec file_mentioned_above -g typescript-axios -o some_path
我对上面提到的规范文件做错了什么还是与 Go for openapi-generator 有关?
解决方法
尝试重新组织架构以使用 allOf
继承而不是 oneOf
。还要确保在基本架构中指定鉴别器 mapping
。如果没有 mapping
,API 定义假定子架构与鉴别器属性值具有相同的名称,而在您的示例中并非如此。
这是一个 YAML 版本,您可以使用 https://www.json2yaml.com/ 将其转换为 JSON。
components:
schemas:
Web3SigningCredential:
type: object
required:
- type
discriminator:
propertyName: type
mapping:
CACTUS_KEYCHAIN_REF: Web3SigningCredentialCactusKeychainRef
GETH_KEYCHAIN_PASSWORD: Web3SigningCredentialGethKeychainPassword
PRIVATE_KEY_HEX: Web3SigningCredentialPrivateKeyHex
NONE: Web3SigningCredentialNone
properties:
type:
$ref: '#/components/schemas/Web3SigningCredentialType'
Web3SigningCredentialGethKeychainPassword:
allOf:
- $ref: '#/components/schemas/Web3SigningCredential'
- type: object
required:
- ethAccount
- secret
properties:
ethAccount:
type: string
description: The ethereum account (public key) that the credential belongs to. Basically the username in the traditional terminology of authentication.
minLength: 64
maxLength: 64
nullable: false
secret:
type: string
description: A geth keychain unlock password.
minLength: 0
maxLength: 65535
相应地更新 Web3SigningCredentialCactusKeychainRef
、Web3SigningCredentialPrivateKeyHex
和 Web3SigningCredentialNone
架构。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。