我正在尝试记录从验证器类返回给 Controller 的错误,但是我只得到ObjectError返回,这意味着我无法在记录器中记录更多特定信息。
例如:
public void logErrors(BindingResult bindingResult){
for (Object object : bindingResult.getAllErrors()) {
if (object instanceof ObjectError) {
ObjectError objectError = (ObjectError) object;
logger.error("Bad request for " + ((FieldError) objectError).getField() + " of " + objectError.getObjectName() + " in myClass");
}
if (object instanceof FieldError) {
FieldError fieldError = (FieldError) object;
logger.error("Bad request for " + fieldError.getCode() + " of " + fieldError.getObjectName() + " in myClass");
}
}
}
收到fieldError时,此操作按预期工作,但尝试处理ObjectError无效。正如您在上面看到的(以及在其他线程中所建议的那样),建议将ObjectError强制转换为FieldError,但目前无法正常工作,并指出我无法将ObjectError转换为FieldError。还有另一种方法可以完成我想要的吗?谢谢!
编辑:让我通过显示我的验证器类方法来澄清一下,我正在通过输入应该引发最小错误的ID进行测试。
@Override
public void validate(Object target, Errors errors) {
MyClass myClass = (MyClass) target;
if(myCLass.getId() < 1000 || myClass.getId() > 100000) {
errors.reject("myClass", "Id[must be between 1000 and 100000");
}
}
MyClass的简化版本(它是POJO):
public class MyClass {
private Long Id;
public Long getId() {
return Id;
}
public void setId(Long Id) {
this.Id = Id;
}
}
最佳答案
FieldError是ObjectError的子类,因此不能将ObjectError
转换为FieldError
。
在您当前的for
循环中,您将获得FieldError
的重复日志,因为两个if
语句的求和结果均为true
。您可以按如下方式重写for循环:
public void logErrors(BindingResult bindingResult){
for (ObjectError objectError : bindingResult.getAllErrors()) {
if (objectError instanceof FieldError) {
FieldError fieldError = (FieldError) objectError;
logger.error(...); // log field error
}
else {
logger.error(...); // log object error
}
}
}
如果您仅对FieldErrors感兴趣,则可以使用
getFieldErrors()
方法代替getAllErrors()
。编辑:
使用
rejectValue()
而不是reject()
生成字段错误。