2016-01-18 4 views
0

Я использую класс Java Swagger-Codegen для генерации клиента C# для Swagger Web Api, предоставляющего службу публикации прошивки.Swagger-codegen C#: Отсутствует клиентский член типа byte []

public Byte[] LelFile свойство класса DTO PackagePublishRequestInfoAndLel, необходимого в качестве параметра метода ApiController public async Task<IHttpActionResult> PublishPackageAsync(...) отсутствует в сгенерированном классе клиент DataContract.

Я сделал что-то неправильно? Есть ли что-то особенное для обработки свойств 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 property:

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: (Правильно в том числе свойство 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" 
    } 
    } 
}, 

И, наконец, неполное Сваггер-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; 
    } 
    } 
} 

Добавление:

Я думаю, что проблема может быть в формате Swashbuckle/Swagger типа byte []. Так вот мой класс SwaggerConfig код: (отображение байта [] тип может быть неправильно ...)

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("[email protected]")) 
             .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" 
               } 
           }); 

Но это код привел к исключению, когда lauching чванства-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 
+0

Эта проблема также была задана здесь: https://github.com/swagger-api/swagger-codegen/issues/1918 –

ответ

3

binary формата (отображается в байтах [] в клиенте C# API) поддерживается в последнем мастере Swagger-Codegen, и он будет включен в предстоящую стабильную версию 2.1.6.

Продвиньте последний мастер, чтобы получить поддержку байта [] в клиенте C# API.