Swagger-codegen c#:缺少 byte [] 类型的客户端成员
Swagger-codegen c#: Missing client member of type byte[]
我正在使用 java Swagger-Codegen class 为 Swagger Web Api 公开固件发布服务生成 c# 客户端。
public Byte[] LelFile
属性PackagePublishRequestInfoAndLel
dtoclass需要作为 public async Task<IHttpActionResult> PublishPackageAsync(...)
ApiController 方法的参数在生成的客户端 DataContract 中丢失 class.
我是不是做错了什么?有什么特别的事情可以处理 Byte[]
属性吗?或者这是一个要在 Swagger-Codegen Github 项目中报告的问题?
注意PackagePublishRequestInfo PackagePublishRequestInfoAndLel.PackagePublishRequestInfo
成员属性在客户端正确暴露,只有Byte[] PackagePublishRequestInfoAndLel.LelFile
[= DataContract class.
中缺少 65=] 成员 属性
感谢您的帮助。
以下是一些代码摘录:
LelController (ApiController) class 公开了 public async Task<IHttpActionResult> PublishPackageAsync()
方法:(信息)
/// <summary>
/// The lel ApiController handling lel file publication.
/// </summary>
[System.Web.Http.RoutePrefix("api/Lels")]
[GenerateFactory(typeof(ILelControllerFactory))]
public class LelController : ApiController,
ILelController
{
#region Fields
private readonly ILelRepository lelRepository; // Repository to access the Datasets in the RED Database
#endregion
#region Constructors and Destructors
/// <summary>
/// Initializes a new instance of the <see cref="LelController"/> class.
/// </summary>
/// <param name="lelRepository">
/// The lel repository.
/// </param>
public LelController(ILelRepository lelRepository)
{
this.lelRepository = lelRepository;
}
#endregion
#region Public Methods and Operators
/// <summary>
/// Publishes a new firmware package.
/// </summary>
/// <param name="packagePublishRequestInfoAndLel">
/// The package publish info and the lel file content.
/// </param>
/// <returns>
/// The returned IHttpActionResult
/// </returns>
[System.Web.Http.Route("")]
[SwaggerResponse(HttpStatusCode.Created, "Package succesfully published.")]
[SwaggerResponse(HttpStatusCode.NotFound, "Unable to publish posted package data. (Detailed error message available in the response body).")]
[SwaggerResponse(HttpStatusCode.InternalServerError, "Internal server error. Package not published. An HttpException is returned with the original inner exception thrown. (Detailed error message available in the returned exception).", typeof(HttpException))]
public async Task<IHttpActionResult> PublishPackageAsync(PackagePublishRequestInfoAndLel packagePublishRequestInfoAndLel)
{
// Try to publish the package:
await this.lelRepository.PublishPackageAsync(packagePublishRequestInfoAndLel);
return this.Content(HttpStatusCode.Created, "Package successfully published.");
}
#endregion
}
PackagePublishRequestInfoAndLel
dto class包括一个byte[] LelFile
属性:
public class PackagePublishRequestInfoAndLel : IPackagePublishRequestInfoAndLel
{
#region Constructors and Destructors
/// <summary>
/// Initializes a new instance of the <see cref="PackagePublishRequestInfoAndLel"/> class.
/// </summary>
public PackagePublishRequestInfoAndLel()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="PackagePublishRequestInfoAndLel"/> class.
/// </summary>
/// <param name="packagePublishRequestInfo">
/// The package Publish Request Info.
/// </param>
/// <param name="lelFile">
/// The lel file.
/// </param>
public PackagePublishRequestInfoAndLel(PackagePublishRequestInfo packagePublishRequestInfo,
byte[] lelFile)
{
this.LelFile = lelFile;
this.PackagePublishRequestInfo = packagePublishRequestInfo;
}
#endregion
#region Public Properties
/// <summary>
/// Gets or sets the lel file
/// </summary>
[Required(AllowEmptyStrings = false, ErrorMessage = ValidationConstants.LelFileIsRequired)]
public byte[] LelFile { get; set; } // The LelFile property missing in the Swagger-Codegen generated client DataContract.
/// <summary>
/// Gets or sets the package publish request info
/// </summary>
public PackagePublishRequestInfo PackagePublishRequestInfo { get; set; }
#endregion
}
Swagger JSon 中的 PackagePublishRequestInfoAndLel
定义:(正确包含 "Byte[]" 类型的 LelFile 属性 并格式化为 "string")
"PackagePublishRequestInfoAndLel": {
"required": [
"LelFile"
],
"type": "object",
"properties": {
"LelFile": {
"format": "string",
"type": "byte[]"
},
"PackagePublishRequestInfo": {
"$ref": "#/definitions/PackagePublishRequestInfo"
}
}
},
"PackagePublishRequestInfo": {
"required": [
"UserIdent"
],
"type": "object",
"properties": {
"Override": {
"type": "boolean"
},
"BootManagerVersion": {
"type": "string"
},
"BootloaderVersion": {
"type": "string"
},
"EcuIdent": {
"type": "string"
},
"HardwareVersion": {
"format": "int32",
"type": "integer"
},
"LelFileName": {
"pattern": "^[0-9]{8}_[0-9]{3}\.lel$",
"type": "string"
},
"SoftwareVersion": {
"type": "string"
},
"SpfVersion": {
"type": "string"
},
"Status": {
"type": "string"
},
"UserIdent": {
"format": "int32",
"type": "integer"
},
"DatasetIdent": {
"type": "string"
},
"DatasetRevision": {
"format": "int32",
"type": "integer"
}
}
},
最后,不完整的Swagger-Codegen生成客户端DataContract:
namespace IO.Swagger.Model
{
[DataContract]
public class PackagePublishRequestInfoAndLel : IEquatable<PackagePublishRequestInfoAndLel>
{
[DataMember(EmitDefaultValue = false, Name = "PackagePublishRequestInfo")]
public PackagePublishRequestInfo PackagePublishRequestInfo { get; set; }
// Here, missing public Byte[] LelFile DataMember !!!
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("class PackagePublishRequestInfoAndLel {\n");
stringBuilder.Append(" PackagePublishRequestInfo: ").Append((object) this.PackagePublishRequestInfo).Append("\n");
stringBuilder.Append("}\n");
return ((object) stringBuilder).ToString();
}
public string ToJson()
{
return JsonConvert.SerializeObject((object) this, Formatting.Indented);
}
public override bool Equals(object obj)
{
return this.Equals(obj as PackagePublishRequestInfoAndLel);
}
public bool Equals(PackagePublishRequestInfoAndLel other)
{
if (other == null)
return false;
if (this.PackagePublishRequestInfo == other.PackagePublishRequestInfo)
return true;
if (this.PackagePublishRequestInfo != null)
return this.PackagePublishRequestInfo.Equals(other.PackagePublishRequestInfo);
else
return false;
}
public override int GetHashCode()
{
int num = 41;
if (this.PackagePublishRequestInfo != null)
num = num * 57 + this.PackagePublishRequestInfo.GetHashCode();
return num;
}
}
}
附录:
我猜问题可能出在byte[]类型的Swashbuckle/Swagger映射上。所以这是我的 SwaggerConfig class 代码:(byte[] 类型的映射可能是错误的...)
public class SwaggerConfig
{
#region Public Methods and Operators
/// <summary>
/// Register the configuration for Swashbuckle (Swagger .Net)
/// </summary>
/// <param name="config">
/// The global configuration
/// </param>
public static void Register(HttpConfiguration config)
{
config.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "RedFull.Api")
.Description(@"An API for accessing the Firmware Database services."
+ "(lel file publishing and firmware package retrieval)"
+ "<br /><br />Service events viewer is available on : <a href='/elmah.axd'>ELMAH</a> page")
.TermsOfService("Terms of service: Reserved for internal usage.")
.Contact(cc => cc
.Name("Firmware Services"
.Url("https://xxxxx.com/yyyy/Home.aspx")
.Email("xxx.yyy@gmail.com"))
.License(lc => lc
.Name("Usage License")
.Url("http://xxxxx.com/license"));
c.MapType<byte[]>(() => new Schema
{
type = "byte[]",
format = "string"
});
...
我也试过这样声明映射:
c.MapType<byte[]>(() => new Schema
{
type = "array",
format = "string",
items = new Schema()
{
type = "byte",
format = "int32"
}
});
但是这段代码在启动 swagger-codegen 生成器时导致异常:
Exception in thread "main" java.lang.RuntimeException: Could not generate model
'PackagePublishRequestInfoAndLel'
at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:21
5)
at io.swagger.codegen.cmd.Generate.run(Generate.java:188)
at io.swagger.codegen.SwaggerCodegen.main(SwaggerCodegen.java:35)
Caused by: java.lang.NullPointerException
at io.swagger.codegen.languages.CSharpClientCodegen.getSwaggerType(CShar
pClientCodegen.java:246)
at io.swagger.codegen.DefaultCodegen.getTypeDeclaration(DefaultCodegen.j
ava:714)
at io.swagger.codegen.languages.CSharpClientCodegen.getTypeDeclaration(C
SharpClientCodegen.java:239)
at io.swagger.codegen.languages.CSharpClientCodegen.getTypeDeclaration(C
SharpClientCodegen.java:232)
at io.swagger.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:10
32)
at io.swagger.codegen.DefaultCodegen.addVars(DefaultCodegen.java:1868)
at io.swagger.codegen.DefaultCodegen.fromModel(DefaultCodegen.java:845)
at io.swagger.codegen.DefaultGenerator.processModels(DefaultGenerator.ja
va:695)
at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:18
9)
... 2 more
binary
格式(映射到 C# API 客户端中的 byte[])在 Swagger-Codegen 的最新主控中得到支持,并将包含在即将发布的稳定版本 2.1 中。 6.
请暂时拉取最新的master,以获得C#API客户端对byte[]的支持
我正在使用 java Swagger-Codegen class 为 Swagger Web Api 公开固件发布服务生成 c# 客户端。
public Byte[] LelFile
属性PackagePublishRequestInfoAndLel
dtoclass需要作为 public async Task<IHttpActionResult> PublishPackageAsync(...)
ApiController 方法的参数在生成的客户端 DataContract 中丢失 class.
我是不是做错了什么?有什么特别的事情可以处理 Byte[]
属性吗?或者这是一个要在 Swagger-Codegen Github 项目中报告的问题?
注意PackagePublishRequestInfo PackagePublishRequestInfoAndLel.PackagePublishRequestInfo
成员属性在客户端正确暴露,只有Byte[] PackagePublishRequestInfoAndLel.LelFile
[= DataContract class.
感谢您的帮助。
以下是一些代码摘录:
LelController (ApiController) class 公开了 public async Task<IHttpActionResult> PublishPackageAsync()
方法:(信息)
/// <summary>
/// The lel ApiController handling lel file publication.
/// </summary>
[System.Web.Http.RoutePrefix("api/Lels")]
[GenerateFactory(typeof(ILelControllerFactory))]
public class LelController : ApiController,
ILelController
{
#region Fields
private readonly ILelRepository lelRepository; // Repository to access the Datasets in the RED Database
#endregion
#region Constructors and Destructors
/// <summary>
/// Initializes a new instance of the <see cref="LelController"/> class.
/// </summary>
/// <param name="lelRepository">
/// The lel repository.
/// </param>
public LelController(ILelRepository lelRepository)
{
this.lelRepository = lelRepository;
}
#endregion
#region Public Methods and Operators
/// <summary>
/// Publishes a new firmware package.
/// </summary>
/// <param name="packagePublishRequestInfoAndLel">
/// The package publish info and the lel file content.
/// </param>
/// <returns>
/// The returned IHttpActionResult
/// </returns>
[System.Web.Http.Route("")]
[SwaggerResponse(HttpStatusCode.Created, "Package succesfully published.")]
[SwaggerResponse(HttpStatusCode.NotFound, "Unable to publish posted package data. (Detailed error message available in the response body).")]
[SwaggerResponse(HttpStatusCode.InternalServerError, "Internal server error. Package not published. An HttpException is returned with the original inner exception thrown. (Detailed error message available in the returned exception).", typeof(HttpException))]
public async Task<IHttpActionResult> PublishPackageAsync(PackagePublishRequestInfoAndLel packagePublishRequestInfoAndLel)
{
// Try to publish the package:
await this.lelRepository.PublishPackageAsync(packagePublishRequestInfoAndLel);
return this.Content(HttpStatusCode.Created, "Package successfully published.");
}
#endregion
}
PackagePublishRequestInfoAndLel
dto class包括一个byte[] LelFile
属性:
public class PackagePublishRequestInfoAndLel : IPackagePublishRequestInfoAndLel
{
#region Constructors and Destructors
/// <summary>
/// Initializes a new instance of the <see cref="PackagePublishRequestInfoAndLel"/> class.
/// </summary>
public PackagePublishRequestInfoAndLel()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="PackagePublishRequestInfoAndLel"/> class.
/// </summary>
/// <param name="packagePublishRequestInfo">
/// The package Publish Request Info.
/// </param>
/// <param name="lelFile">
/// The lel file.
/// </param>
public PackagePublishRequestInfoAndLel(PackagePublishRequestInfo packagePublishRequestInfo,
byte[] lelFile)
{
this.LelFile = lelFile;
this.PackagePublishRequestInfo = packagePublishRequestInfo;
}
#endregion
#region Public Properties
/// <summary>
/// Gets or sets the lel file
/// </summary>
[Required(AllowEmptyStrings = false, ErrorMessage = ValidationConstants.LelFileIsRequired)]
public byte[] LelFile { get; set; } // The LelFile property missing in the Swagger-Codegen generated client DataContract.
/// <summary>
/// Gets or sets the package publish request info
/// </summary>
public PackagePublishRequestInfo PackagePublishRequestInfo { get; set; }
#endregion
}
Swagger JSon 中的 PackagePublishRequestInfoAndLel
定义:(正确包含 "Byte[]" 类型的 LelFile 属性 并格式化为 "string")
"PackagePublishRequestInfoAndLel": {
"required": [
"LelFile"
],
"type": "object",
"properties": {
"LelFile": {
"format": "string",
"type": "byte[]"
},
"PackagePublishRequestInfo": {
"$ref": "#/definitions/PackagePublishRequestInfo"
}
}
},
"PackagePublishRequestInfo": {
"required": [
"UserIdent"
],
"type": "object",
"properties": {
"Override": {
"type": "boolean"
},
"BootManagerVersion": {
"type": "string"
},
"BootloaderVersion": {
"type": "string"
},
"EcuIdent": {
"type": "string"
},
"HardwareVersion": {
"format": "int32",
"type": "integer"
},
"LelFileName": {
"pattern": "^[0-9]{8}_[0-9]{3}\.lel$",
"type": "string"
},
"SoftwareVersion": {
"type": "string"
},
"SpfVersion": {
"type": "string"
},
"Status": {
"type": "string"
},
"UserIdent": {
"format": "int32",
"type": "integer"
},
"DatasetIdent": {
"type": "string"
},
"DatasetRevision": {
"format": "int32",
"type": "integer"
}
}
},
最后,不完整的Swagger-Codegen生成客户端DataContract:
namespace IO.Swagger.Model
{
[DataContract]
public class PackagePublishRequestInfoAndLel : IEquatable<PackagePublishRequestInfoAndLel>
{
[DataMember(EmitDefaultValue = false, Name = "PackagePublishRequestInfo")]
public PackagePublishRequestInfo PackagePublishRequestInfo { get; set; }
// Here, missing public Byte[] LelFile DataMember !!!
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("class PackagePublishRequestInfoAndLel {\n");
stringBuilder.Append(" PackagePublishRequestInfo: ").Append((object) this.PackagePublishRequestInfo).Append("\n");
stringBuilder.Append("}\n");
return ((object) stringBuilder).ToString();
}
public string ToJson()
{
return JsonConvert.SerializeObject((object) this, Formatting.Indented);
}
public override bool Equals(object obj)
{
return this.Equals(obj as PackagePublishRequestInfoAndLel);
}
public bool Equals(PackagePublishRequestInfoAndLel other)
{
if (other == null)
return false;
if (this.PackagePublishRequestInfo == other.PackagePublishRequestInfo)
return true;
if (this.PackagePublishRequestInfo != null)
return this.PackagePublishRequestInfo.Equals(other.PackagePublishRequestInfo);
else
return false;
}
public override int GetHashCode()
{
int num = 41;
if (this.PackagePublishRequestInfo != null)
num = num * 57 + this.PackagePublishRequestInfo.GetHashCode();
return num;
}
}
}
附录:
我猜问题可能出在byte[]类型的Swashbuckle/Swagger映射上。所以这是我的 SwaggerConfig class 代码:(byte[] 类型的映射可能是错误的...)
public class SwaggerConfig
{
#region Public Methods and Operators
/// <summary>
/// Register the configuration for Swashbuckle (Swagger .Net)
/// </summary>
/// <param name="config">
/// The global configuration
/// </param>
public static void Register(HttpConfiguration config)
{
config.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "RedFull.Api")
.Description(@"An API for accessing the Firmware Database services."
+ "(lel file publishing and firmware package retrieval)"
+ "<br /><br />Service events viewer is available on : <a href='/elmah.axd'>ELMAH</a> page")
.TermsOfService("Terms of service: Reserved for internal usage.")
.Contact(cc => cc
.Name("Firmware Services"
.Url("https://xxxxx.com/yyyy/Home.aspx")
.Email("xxx.yyy@gmail.com"))
.License(lc => lc
.Name("Usage License")
.Url("http://xxxxx.com/license"));
c.MapType<byte[]>(() => new Schema
{
type = "byte[]",
format = "string"
});
...
我也试过这样声明映射:
c.MapType<byte[]>(() => new Schema
{
type = "array",
format = "string",
items = new Schema()
{
type = "byte",
format = "int32"
}
});
但是这段代码在启动 swagger-codegen 生成器时导致异常:
Exception in thread "main" java.lang.RuntimeException: Could not generate model
'PackagePublishRequestInfoAndLel'
at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:21
5)
at io.swagger.codegen.cmd.Generate.run(Generate.java:188)
at io.swagger.codegen.SwaggerCodegen.main(SwaggerCodegen.java:35)
Caused by: java.lang.NullPointerException
at io.swagger.codegen.languages.CSharpClientCodegen.getSwaggerType(CShar
pClientCodegen.java:246)
at io.swagger.codegen.DefaultCodegen.getTypeDeclaration(DefaultCodegen.j
ava:714)
at io.swagger.codegen.languages.CSharpClientCodegen.getTypeDeclaration(C
SharpClientCodegen.java:239)
at io.swagger.codegen.languages.CSharpClientCodegen.getTypeDeclaration(C
SharpClientCodegen.java:232)
at io.swagger.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:10
32)
at io.swagger.codegen.DefaultCodegen.addVars(DefaultCodegen.java:1868)
at io.swagger.codegen.DefaultCodegen.fromModel(DefaultCodegen.java:845)
at io.swagger.codegen.DefaultGenerator.processModels(DefaultGenerator.ja
va:695)
at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:18
9)
... 2 more
binary
格式(映射到 C# API 客户端中的 byte[])在 Swagger-Codegen 的最新主控中得到支持,并将包含在即将发布的稳定版本 2.1 中。 6.
请暂时拉取最新的master,以获得C#API客户端对byte[]的支持