关于验证器Validator的问题?

请问验证器Validator的handleError怎么获取到renderJson对象,怎么获取该对象第一个属性的值。

微信图片_20200616144833.png

微信图片_20200616144843.png

我要的效果是:在handleError里将“请输入Blog内容!”返回到前端,也就是说这里不管怎么排序,把第一个的值传到前端。

评论区

HingLo

2020-06-16 15:01

这样,你写个BaseValidator ,重写:addError(String errorKey, String errorMessage),与handleError(Controller c),返回的时候你只返回第一个错误就是了。

JFinal

2020-06-16 17:11

结合 setRet(...) 与 getRet() 来用:

public class LoginValidator extends Validator {

protected void validate(Controller c) {
setShortCircuit(true);

/**
* 注入 Ret 对象,validateXxx(...) 方法的验证结果将被存放于该 Ret 对象之中,
* 以便于 handleError 中使用:
* controller.renderJson(getRet());
*
* 具体到本例,LoginController.doLogin() 中使用的 renderJson(ret)
* 与 LoginValidator.handleError() 中使用的 c.renderJson(getRet())
* 实现了返回值格式的统一(Ret 设置 state、msg 属性值),所以前端 js 可以
* 统一处理返回数据:
* if (ret.state == "ok") {
* location.href = ret.returnUrl;
* } else {
* alert(ret.msg);
* }
*
* 否则 Validator 层与 Service 层返回的 Ret 值格式将不同,前端 js 需要
* 对两种格式分别做处理
*/
setRet(Ret.fail()); // Ret.fail() 将设置 state : "fail" 值

validateRequired("userName", "msg", "邮箱不能为空");
validateEmail("userName", "msg", "邮箱格式不正确");

validateRequired("password", "msg", "密码不能为空");
validateCaptcha("captcha", "msg", "验证码不正确");
}

protected void handleError(Controller c) {
// getRet() 与 setRet(...) 配合使用
Ret ret = getRet();
c.renderJson(ret);
}
}

JFinal

2020-06-16 17:12

如果你希望一旦出现错误的数据就立即返回使用下面的方法即可:
setShortCircuit(true);

1377205950

2020-06-16 20:02

@JFinal 非常感谢,正是我要的结果。

feng_xing

2020-06-18 18:17

@JFinal 这个validate不是很麻烦,我一个控制权有十个方法需要校验,是不是要写10个校验类,这些校验类不就最后是控制权的好多倍,还不如自定义AOP去注解切校验

JFinal

2020-06-20 17:44

@feng_xing Validate 一般用于字段数比较多的表单提交,如果表单有大量重复字段的可以重用同一个 Validator

对于字段比较少的,直接在 controller 中通过 if 判断就可以了

再一个 Validator 属于拦截器,作为一种实现方案存在,你完全可以使用拦截器定制一套自己的 Validator,大量重用代码

我自己的项目中的 Validator 一般很少,一般的 web 项目都是 "读多写少"

JJfinal

2020-06-23 13:09

我觉得验证这里拆开写不错 , 比如name很多地方要验证 , 就写一个nameValidator , 有需要验证name的地方都可以用这个验证 , 主要是可以根据实际情况组合验证 比如 @befo({nameValidator.class, sexValidator.class})

热门反馈

扫码入社