1

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

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

我做错什么了吗?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
}

PackagePublishRequestInfoAndLeldto 类包括一个属性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 属性并格式化为“字符串”)

"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
4

1 回答 1

4

binary最新的Swagger-Codegen大师支持格式(映射到 C# API 客户端中的 byte[]),它将包含在即将发布的稳定版本 2.1.6 中。

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

于 2016-01-21T09:09:02.973 回答