Swagger-codegen c#:缺少byte []

时间:2016-01-18 10:16:11

标签: c# client bytearray swagger codegen

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

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

我做错了吗?处理PackagePublishRequestInfo PackagePublishRequestInfoAndLel.PackagePublishRequestInfo属性有什么特别之处吗?或者这是在Swagger-Codegen Github项目中报告的问题?

请注意, Byte[] PackagePublishRequestInfoAndLel.LelFile 成员属性在客户端中正确公开,而DataContract类中只缺少 public async Task<IHttpActionResult> PublishPackageAsync() 成员属性。

感谢您的帮助。

以下是一些代码摘录:

LelController (ApiController)类暴露 /// <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

包含 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 } dto课程:

PackagePublishRequestInfoAndLel

Swagger JSon中的"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" } } }, 定义:(正确地包括“Byte []”类型的LelFile属性并格式化为“字符串”)

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;
    }
  }
}

最后,不完整的Swagger-Codegen生成了客户端DataContract:

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"
                                                                 });
...

附录:

我猜问题可能出现在byte []类型的Swashbuckle / Swagger映射中。所以这是我的SwaggerConfig类代码:( byte []类型的映射可能是错误的......)

                                 c.MapType<byte[]>(() => new Schema
                                 {
                                     type = "array",
                                     format = "string",
                                     items = new Schema()
                                                 {
                                                     type = "byte",
                                                     format = "int32"
                                                 }
                                 });

我还尝试以这种方式声明映射:

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

但是这个代码在推出swagger-codegen生成器时导致异常:

svn mkdir file:///home/myuser/repository_folder/test/trunk file:///home/myuser/repository_folder/test/branches file:///home/myuser/repository_folder/test/tags -m "Initial repository structure"

1 个答案:

答案 0 :(得分:4)

Swagger-Codegen的最新版本支持

Main Dataset: SELECT Col1, Col2, Start_Date, End_Date, Col3 FROM Table Dataset 1: SELECT DISTINCT Col1 FROM Table Dataset 2: SELECT DISTINCT Col2 FROM Table WHERE (Col1IN (@Param1)) ORDER BY Col2 Dataset 3: SELECT DISTINCT Col1, Col2, Col3 FROM Table WHERE (Col1 IN (@Param1)) AND (Col2 IN (@Param2)) GROUP BY Col1, Col2, Col3 格式(映射到C#API客户端中的byte []),它将包含在即将发布的稳定版本2.1.6中。

请暂时拔出最新的master以获得C#API客户端中byte []的支持。