【问题标题】:Swagger-play2: How to allow array of objects as input in swagger ui using @ApiImplicitParams annotation?Swagger-play2:如何使用 @ApiImplicitParams 注释允许对象数组作为 swagger ui 中的输入?
【发布时间】:2019-12-09 08:23:31
【问题描述】:

我正在尝试为采用案例类对象数组的方法编写 swagger API。我做了以下事情:

package models

import io.swagger.annotations.{ApiModel, ApiModelProperty}
import play.api.data.Form
import play.api.data.Forms.{mapping, nonEmptyText, seq}
import play.api.libs.json.{Json, Writes}
import spray.json.DefaultJsonProtocol

object Message extends DefaultJsonProtocol {

@ApiModel(value = "EmailMessage")
  case class EmailMessage(
                           @(ApiModelProperty@field)(position = 1, dataType = "array", required = true) emails: Seq[String],
                           @(ApiModelProperty@field)(position = 2, required = true) message: String
                         )

}

以及控制器的请求处理方法

@ApiImplicitParams(Array(
    new ApiImplicitParam(value = "EmailMessage", dataType = "models.Message.EmailMessage",
      paramType = "body", name = "body", required = true)
  ))

现在,当我尝试访问此 API 时,出现以下异常:

[error] application - Failed to resolve 'models.Message.EmailMessage' into class
java.lang.ClassNotFoundException: models.Message.EmailMessage
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at play.modules.swagger.PlayReader.typeFromString(PlayReader.java:447)
    at play.modules.swagger.PlayReader.readImplicitParam(PlayReader.java:423)
    at play.modules.swagger.PlayReader.readImplicitParameters(PlayReader.java:396)
    at play.modules.swagger.PlayReader.read(PlayReader.java:199)
    at play.modules.swagger.PlayReader.read(PlayReader.java:64)
    at play.modules.swagger.PlayReader.read(PlayReader.java:58)
    at play.modules.swagger.ApiListingCache$$anonfun$listing$1.apply(ApiListingCache.scala:17)
[info] swagger - Swagger - initialization done.

【问题讨论】:

    标签: scala functional-programming swagger-ui playframework-2.6 swagger-play2


    【解决方案1】:

    好吧,我想通了。我所做的是从 Message 对象中取出 EmailMessage 案例类。

    
        @ApiModel(value = "EmailMessage")
          case class EmailMessage(
                                   @(ApiModelProperty@field)(position = 1, 
        dataType = "List[String]", required = true) emails: Seq[String],
                                   @(ApiModelProperty@field)(position = 2, 
        required = true) message: String
                                 )
    
        object Message extends DefaultJsonProtocol {
    
        val EmailMessageForm = Form(
            mapping(
              "emails" -> seq(nonEmptyText),
              "message" -> nonEmptyText
            )(EmailMessage.apply)(EmailMessage.unapply)
          )
    
        }
    
    

    在@ApiImplicitParam 中,我将 dataType 属性的值更改如下

        @ApiImplicitParams(Array(
            new ApiImplicitParam(value = "EmailMessage payload data", dataType 
        = "models.EmailMessage",
          paramType = "body", name = "body", required = true)
          ))
    

    现在应用程序正在运行,没有任何错误。

    但是当我将 swagger.json 渲染到 OpenAPI 时,我并没有得到很好的用户输入界面。如果有人对此有任何想法,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多