Возврат ошибок проверки в формате JSON с помощью Play! фреймворк

#java #ajax #json #validation #playframework

#java #ajax #json #проверка #playframework

Вопрос:

Я хочу создать приложение, в котором формы отправляются через Ajax без полной перезагрузки страницы. Для отображения ошибок проверки на стороне сервера сервер должен возвращать ошибки проверки в формате JSON и соответствующий статус HTTP (400).

Как я могу добиться этого с помощью Play! фреймворк?

Ответ №1:

В Play Framework 2.x и Scala вы можете использовать этот пример:

 import play.api.libs.json._

case class LoginData(email : String, password: String)

implicit object FormErrorWrites extends Writes[FormError] {
  override def writes(o: FormError): JsValue = Json.obj(
    "key" -> Json.toJson(o.key),
    "message" -> Json.toJson(o.message)
  )
}

val authForm = Form[LoginData](mapping(
  "auth.email" -> email.verifying(Constraints.nonEmpty),
  "auth.password" -> nonEmptyText
  )(LoginData.apply)(LoginData.unapply))

def registerUser = Action { implicit request =>
 authForm.bindFromRequest.fold(
  form => UnprocessableEntity(Json.toJson(form.errors)),
  auth => Ok(Json.toJson(List(auth.email, auth.password)))
 )
}
  

Я вижу, что этот вопрос помечен тегом java, но я полагаю, что это может быть полезно для разработчиков Scala.

Комментарии:

1. Операторы импорта для приведенного выше должны включать import play.api.libs.json._ , и неявный объект, скорее всего, может существовать в вашем контроллере как объект многократного использования, поскольку вы преобразуете ошибки формы (обратите внимание на ошибки точки формы), а не что-либо уникальное для самого класса case. Более чем очевидно, когда вы все это знаете, но stackoverflow помогает тем, кто этого не делает 🙂

2. Спасибо за советы, я добавил импорт.

Ответ №2:

Вы ищете что-то более сложное, чем это:

 public static void yourControllerMethod() {
    ... // your validation logic

    if (validation.hasErrors()) {
       response.status = 400;
       renderJSON(validation.errors);
    }
}
  

Ответ №3:

Для выполнения проверки вашего запроса на стороне сервера Play framework предоставляет встроенный модуль проверки, который использует Hibernate Validator под капотом.

Предполагая, что у вас есть класс POJO, соответствующий входящему запросу,

 import play.data.validation.Constraints;
    public class UserRequest{       
    @Constraints.Required
    private String userName;

    @Constraints.Required
    private String email;
}
  

Проверка запроса может быть выполнена с контроллера следующим образом.

 public class UserController extends Controller{
Form<UserRequest> requestData = Form.form(UserRequest.class).bindFromRequest();
    if(requestData.hasErrors()){
        return badRequest(requestData.errorsAsJson());
    } else{
        //... successful validation
    }
}
  

Если запрос не прошел проверку, будет выдан следующий ответ.

 {
  "userName": [
    "This field is required"
  ],
  "email": [
    "This field is required"
  ]
}
  

В дополнение к этому вы можете применить несколько ограничений к полям класса. Некоторые из них,

  • @Constraints.Min()
  • @Constraints.Max()
  • @Ограничения.Электронная почта

Ответ №4:

Посмотрите на папку samples-and-tests и приложение для проверки. Один из примеров (Sample7) делает именно то, что вам нужно, используя пользовательский тег с именем jQueryValidate (который вы можете видеть в примере).

Если вы попробуете пример, вы увидите, что это довольно простое решение, и, на мой взгляд, этот метод проверки должен быть частью основного игрового фрейма.