gpt4 book ai didi

spring - FieldError vs ObjectError vs 全局错误

转载 作者:行者123 更新时间:2023-12-04 15:41:47 28 4
gpt4 key购买 nike

我正在阅读 Spring 4 API 并试图了解 FieldError 之间的区别, ObjectError和全局错误,都在 BindingResult 的上下文中.我猜全局错误是 ObjectError 的另一个名称。 s 自 getGlobalError()返回 ObjectError .

上下文是我希望在某些表单验证后简单地打印错误消息,并想知道如何避免实例检查,如 this accepted answer .我可以使用 FieldError并忽略对象错误?如果我只登录 FieldError,我会错过什么年代?

我已经尝试了一些场景,但还没有看到区别。同时会查看一些来源。

最佳答案

I'm guessing that global errors are another name for ObjectErrors since getGlobalError() returns an ObjectError.



实际上,“全局错误”是任何 ObjectError这不是 FieldError 的实例见 sourcegetGlobalErrors()

What would I be missing if I only logged FieldErrors?



任意 ObjectError s 该代码注册为“全局错误”,例如调用 BindingResult.reject(errorCode, errorArgs, defaultMessage) .

另见 javadoc对于 rejectValue(field, errorCode, errorArgs, defaultMessage) .通常,错误是针对已验证/绑定(bind)对象的字段(例如,其属性与 Spring 表单标记的 modelAttribute 标记匹配的模型值)而不是对象本身注册的。

以下是创建全局错误的几种方法:
  • 假设它是根表单对象,而不是通过 Spring Validator implementation 验证的嵌套对象,您可以通过将 null 作为 rejectValue 的字段名称参数传递来添加“全局错误”(在指定绑定(bind)根对象的上下文中) .但是,如果要验证的对象是嵌套对象,则 FieldError将针对嵌套对象字段注册。所以重要的是nestedPath (“嵌套对象图”)目标的属性Errors反对一般 ObjectError或具体 FieldError被添加。
  • 通过在类级别应用的 JSR 303 约束注释。见 example在其中检查模型对象在数据存储中是否存在。

  • 这是一个引用全局与字段级别错误的示例:
    public class OverflowErrorsTag extends HtmlEscapingAwareTag {

    public static final String OVERFLOW_ERRORS_VARIABLE_NAME = "overflowErrors";
    public static final String GLOBAL_ERRORS_VARIABLE_NAME = "globalErrors";

    private String name;

    /**
    * Set the name of the bean that this tag should check.
    */
    public void setName(String name) {
    this.name = name;
    }

    /**
    * Return the name of the bean that this tag checks.
    */
    public String getName() {
    return this.name;
    }

    @Override
    protected final int doStartTagInternal() throws ServletException, JspException {
    Errors errors = getRequestContext().getErrors(this.name, isHtmlEscape());
    Set<FieldError> subsequentErrors = Sets.newTreeSet((fe1, fe2) -> fe1.getField().compareTo(fe2.getField()));
    Set<ObjectError> globalErrors = new HashSet<>();
    if (errors != null) {
    Set<String> firstErrorFields = new HashSet<>();
    for (FieldError fieldError : errors.getFieldErrors()) {
    if (firstErrorFields.contains(fieldError.getField())) {
    subsequentErrors.add(fieldError);
    } else {
    firstErrorFields.add(fieldError.getField());
    }
    }
    for (ObjectError objectError : errors.getGlobalErrors()) {
    globalErrors.add(objectError);
    }
    }
    if (subsequentErrors.isEmpty() && globalErrors.isEmpty()) {
    return SKIP_BODY;
    } else {
    this.pageContext.setAttribute(OVERFLOW_ERRORS_VARIABLE_NAME, subsequentErrors, PageContext.REQUEST_SCOPE);
    this.pageContext.setAttribute(GLOBAL_ERRORS_VARIABLE_NAME, globalErrors, PageContext.REQUEST_SCOPE);
    return EVAL_BODY_INCLUDE;
    }
    }

    @Override
    public int doEndTag() {
    this.pageContext.removeAttribute(OVERFLOW_ERRORS_VARIABLE_NAME, PageContext.REQUEST_SCOPE);
    this.pageContext.removeAttribute(GLOBAL_ERRORS_VARIABLE_NAME, PageContext.REQUEST_SCOPE);
    return EVAL_PAGE;
    }

    }

    然后在 View 中显示包含全局错误和字段错误的此标记:
    <spring-ext:overflowErrors name="newModelObject">
    <div class="row">
    <div class="large-12 columns">
    <div class="alert panel">
    <c:if test="${overflowErrors.size()>0}">
    <p>There are multiple errors with your entry.</p>
    <c:forEach var="error" items="${overflowErrors}">
    ${fn:toUpperCase(fn:substring(error.field, 0, 1))}${fn:toLowerCase(
    fn:substring(error.field, 1,fn:length(error.field)))}:
    <b><spring:message message="${error}" /></b>
    <br/>
    </c:forEach>
    </c:if>
    <c:forEach var="error" items="${globalErrors}">
    <b><spring:message message="${error}" /></b>
    <br/>
    </c:forEach>
    </div>
    </div>
    </div>
    </spring-ext:overflowErrors>

    关于spring - FieldError vs ObjectError vs 全局错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37781632/

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