gpt4 book ai didi

c# - Swagger-codegen c# : Missing client member of type byte[]

转载 作者:太空宇宙 更新时间:2023-11-03 21:15:12 26 4
gpt4 key购买 nike

我正在使用 java Swagger-Codegen 类为公开固件发布服务的 Swagger Web Api 生成 c# 客户端。

public Byte[] LelFile 的属性 PackagePublishRequestInfoAndLel 需要 dto 类作为 public async Task<IHttpActionResult> PublishPackageAsync(...) 的参数 生成的客户端 DataContract 类中缺少 ApiController 方法。

我做错了什么吗?有什么特别的事情要做来处理Byte[]特性 ?或者这是一个要在 Swagger-Codegen Github 项目中报告的问题?

注意 PackagePublishRequestInfo PackagePublishRequestInfoAndLel.PackagePublishRequestInfo 成员属性在客户端中正确公开,只有 Byte[] PackagePublishRequestInfoAndLel.LelFile DataContract 类中缺少成员属性。

感谢您的帮助。

以下是一些代码摘录:

LelController (ApiController) 类公开了 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 类包括一个 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
}

PackagePublishRequestInfoAndLel Swagger JSon 中的定义:(正确地包括“Byte[]”类型的 LelFile 属性并格式化为“字符串”)

"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 类代码:(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[]的支持。

关于c# - Swagger-codegen c# : Missing client member of type byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34852192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com