我正在使用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"
答案 0 :(得分:4)
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 []的支持。