gpt4 book ai didi

spring - 从BindingResult中的ObjectError中获取FieldErrors

转载 作者:行者123 更新时间:2023-12-03 07:52:35 26 4
gpt4 key购买 nike

我正在尝试记录从验证器类返回给 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()生成字段错误。

关于spring - 从BindingResult中的ObjectError中获取FieldErrors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59184125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com