Java 除非使用editor.Swagger.io,否则在简单类型上生成Swagger JaxRS规范失败
我对大摇大摆的YAML和代码生成有意见 我试图从这个非常简单的片段生成代码:Java 除非使用editor.Swagger.io,否则在简单类型上生成Swagger JaxRS规范失败,java,jax-rs,swagger,swagger-codegen,Java,Jax Rs,Swagger,Swagger Codegen,我对大摇大摆的YAML和代码生成有意见 我试图从这个非常简单的片段生成代码: swagger: '2.0' info: version: 1.0.0 title: Number API host: localhost basePath: /v2 schemes: - http paths: '/numbers': get: summary: Get number description: Returns a number operation
swagger: '2.0'
info:
version: 1.0.0
title: Number API
host: localhost
basePath: /v2
schemes:
- http
paths:
'/numbers':
get:
summary: Get number
description: Returns a number
operationId: getNumber
produces:
- application/json
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/Numbers'
definitions:
Numbers:
$ref: '#/definitions/Number'
Number:
type: number
我使用swagger-codegen-cli-2.2.3.jar执行以下命令:
java -jar swagger-codegen-cli-2.2.3.jar generate -i swagger.yaml -l jaxrs-spec -o ./
现在,预期的输出是一个非常简单的API实现,其中/numbers端点的响应是BigDecimal。我得到了这个,如果我使用的话,它利用了
然而,使用上面的命令,我得到了一个API实现,其中响应尝试返回一个名为“Numbers”的模型。模型实现如下所示:
package io.swagger.model;
import javax.validation.constraints.*;
import io.swagger.annotations.*;
import java.util.Objects;
public class Numbers {
@Override
public boolean equals(java.lang.Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Numbers numbers = (Numbers) o;
return true;
}
@Override
public int hashCode() {
return Objects.hash();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class Numbers {\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(java.lang.Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}
这是不正确的,因为Numbers对象应该简单地转换为BigDecimal,就像Swagger生成器所做的那样
有人能向我解释为什么会发生这种情况,以及我能做些什么使generator cli按预期运行吗
编辑:
我已经研究了editor.swagger.io和codegen cli生成的JSON。来自editor.swagger.io的JSON与生成的代码一起出现在ZIP存档中。看起来是这样的:
package io.swagger.model;
import javax.validation.constraints.*;
import io.swagger.annotations.*;
import java.util.Objects;
public class Numbers {
@Override
public boolean equals(java.lang.Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Numbers numbers = (Numbers) o;
return true;
}
@Override
public int hashCode() {
return Objects.hash();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class Numbers {\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(java.lang.Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}
来自Swagger编辑器JAXRS-SPEC的JSON输出:
{
"swagger" : "2.0",
"info" : {
"version" : "1.0.0",
"title" : "Number API"
},
"host" : "localhost",
"basePath" : "/v2",
"schemes" : [ "http" ],
"paths" : {
"/numbers" : {
"get" : {
"summary" : "Get number",
"description" : "Returns a number",
"operationId" : "getNumber",
"produces" : [ "application/json" ],
"parameters" : [ ],
"responses" : {
"200" : {
"description" : "successful operation",
"schema" : {
"type" : "number"
}
}
}
}
}
},
"definitions" : {
"Numbers" : {
"type" : "number"
},
"Number" : {
"type" : "number"
}
}
}
而codegen cli生成的JSON如下所示:
package io.swagger.model;
import javax.validation.constraints.*;
import io.swagger.annotations.*;
import java.util.Objects;
public class Numbers {
@Override
public boolean equals(java.lang.Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Numbers numbers = (Numbers) o;
return true;
}
@Override
public int hashCode() {
return Objects.hash();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class Numbers {\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(java.lang.Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}
来自codegen cli v2.2.3、v2.3.0、github master和所有其他版本的codegen cli的JSON
{
"swagger" : "2.0",
"info" : {
"version" : "1.0.0",
"title" : "Number API"
},
"host" : "localhost",
"basePath" : "/v2",
"schemes" : [ "http" ],
"paths" : {
"/numbers" : {
"get" : {
"summary" : "Get number",
"description" : "Returns a number",
"operationId" : "getNumber",
"produces" : [ "application/json" ],
"parameters" : [ ],
"responses" : {
"200" : {
"description" : "successful operation",
"schema" : {
"$ref" : "#/definitions/Numbers"
}
}
}
}
}
},
"definitions" : {
"Numbers" : {
"$ref" : "#/definitions/Number"
},
"Number" : {
"type" : "number"
}
}
}
因此,在Swagger编辑器版本中,REF被转换为简单类型,而REF保留在codegen cli版本中。如果使用旧版本的编辑器,它会生成
数字
模型,因此我猜这在最新版本的Swagger codegen上已经更改。试试看它是否能与jar for 2.3.0 SNAPSHOT@moondaisy最新版本的2.3.0配合使用,SNAPSHOT也会生成<代码>编号代码>模型。。。据我所见,Swagger编辑器生成JSON,其中$refs被转换为type:number。。我将使用从codegen cli和editor.swagger.io获得的JSON更新我的答案,然后您可能想要打开一个问题