使用Play将JSON返回验证错误!骨架

dea*_*mon 7 java validation ajax json playframework

我想构建一个应用程序,通过Ajax提交表单,而无需重新加载页面.要显示服务器端验证错误,服务器应将验证错误作为JSON和适当的HTTP状态返回(400).

我怎样才能通过Play实现这一目标!框架?

Tom*_*mmi 6

你在寻找比这更复杂的东西:

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

    if (validation.hasErrors()) {
       response.status = 400;
       renderJSON(validation.errors);
    }
}
Run Code Online (Sandbox Code Playgroud)


leo*_*idv 6

在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)))
 )
}
Run Code Online (Sandbox Code Playgroud)

我看到这个问题用java标签标记,但我想这对Scala开发人员可能有用.


Rob*_*aju 5

为了对您的请求执行服务器端验证,Play框架提供了一个内置验证模块,该模块使用了Hibernate Validator.

假设您有一个与传入请求相对应的POJO类,

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

    @Constraints.Required
    private String email;
}
Run Code Online (Sandbox Code Playgroud)

可以如下从控制器执行请求验证.

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

如果请求未通过验证,将生成以下响应.

{
  "userName": [
    "This field is required"
  ],
  "email": [
    "This field is required"
  ]
}
Run Code Online (Sandbox Code Playgroud)

除此之外,您还可以将多个约束应用于类字段.他们之中有一些是,

  • @ Constraints.Min()
  • @ Constraints.Max()
  • @ Constraints.Email