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

125
8

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


Как я могу выполнить это с помощью Play! рамки?

спросил(а) 2021-01-19T15:44:54+03:00 6 месяцев назад
1
Решение
117

В 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.

ответил(а) 2021-01-19T15:44:54+03:00 6 месяцев назад
118

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

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

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

ответил(а) 2021-01-19T15:44:54+03:00 6 месяцев назад
100

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


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

ответил(а) 2021-01-19T15:44:54+03:00 6 месяцев назад
63

Чтобы выполнить проверку вашего запроса на стороне сервера, 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()
    @Constraints.Email

ответил(а) 2021-01-19T15:44:54+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема