#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 (который вы можете видеть в примере).
Если вы попробуете пример, вы увидите, что это довольно простое решение, и, на мой взгляд, этот метод проверки должен быть частью основного игрового фрейма.