невозможно создать пользовательское действие в Play / Scala - PullRequest
0 голосов
/ 31 марта 2020

Я работающий кусок кода, который я пытаюсь оптимизировать.

Этот метод занимает Request. Ожидается, что тело будет иметь тип json. Он возвращает ошибку, если тело не json.

def oldSignupUser = silhouette.UserAwareAction.async {

logger.trace(s"received request ${request}")
    val body: AnyContent = request.body
    val jsonBody: Option[JsValue] = body.asJson

jsonBody match {

case Some(json) => {// all good }
case None =>{send custom error}
}

}

Поскольку я использую это во всех моих Action s, я должен вырезать этот кусок кода , Я не хочу использовать parse.json, поскольку хочу отправить свою собственную ошибку.

Я думаю о создании собственного Action и составлении его.

class CustomJsonBodyHandlerAction (parser: BodyParsers.Default,messagesApi: MessagesApi,langs:Langs)(implicit ec: ExecutionContext)
  extends ActionBuilderImpl(parser) {
  val logger = LoggerFactory.getLogger(this.getClass.getName)
  override def invokeBlock[A <: AnyContent](request: Request[A], block: (Request[A]) => Future[Result]) = {
    val body = request.body
    val jsonBody: Option[JsValue] = body.asJson
    jsonBody match {
      case Some(json) => { //got json in message body.
        block(request)
      }
      case None => Future {
        logger.trace("incorrect body type")
        Ok(Json.toJson(JsonResultError(messagesApi("error.incorrectBodyType")(langs.availables(0)))))
      } 

    }
  }
}

У меня 3 сомнения / проблемы

1) Когда я пытаюсь использовать свой пользовательский Action, я получаю ошибки компиляции, потому что не могу предоставить BodyParsers.Default. Как получить экземпляр BodyParsers.Default?

def signupUser = silhouette.UserAwareAction.async (new CustomJsonBodyHandlerAction(cc.parsers.defaultBodyParser,messagesApi,langs){
    implicit request => {
  ...
}

2) Должен ли я создать class или object типа CustomJsonBodyHandlerAction? В чем разница и каков правильный путь?

3) Я использую new CustomJsonBodyHandlerAction при написании Action. Я думаю, что это не правильный путь. Должен ли я изменить CustomJsonBodyHandlerAction на case class?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...