Swagger-play2: как разрешить массив объектов в качестве ввода в пользовательском интерфейсе swagger с использованием аннотации @ApiImplicitParams?

Я пытаюсь написать чванство API для метода, который принимает массив объектов класса case. Я сделал следующее:

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.

1 ответ

Решение

Хорошо, я понял это. Что я сделал, так это вынул класс случая EmailMessage из объекта Message.


    @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 я не получал приятного пользовательского интерфейса ввода. Пожалуйста, дайте мне знать, если кто-нибудь знает об этом.

Другие вопросы по тегам