Я работающий кусок кода, который я пытаюсь оптимизировать.
Этот метод занимает 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
?