我正在尝试记录从验证器类返回给 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;
    }
}

最佳答案

FieldErrorObjectError的子类,因此不能将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()生成字段错误。

07-24 17:29