Я использую класс 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
Эта проблема также была задана здесь: https://github.com/swagger-api/swagger-codegen/issues/1918 –