【问题标题】:Spring validation: method parameter constraint not calledSpring验证:未调用方法参数约束
【发布时间】:2020-02-27 13:01:00
【问题描述】:

每个人。

所以,我有一个带有控制器的 SpringBoot 应用程序,该控制器具有多种方法,将以下 POJO 作为参数:

package com.example.dto;

import lombok.Data;

@Data
public class MyEntity {
   @NotNull
   private String fieldA;

   private String fieldB;
}

对于其中一个控制器端点,我想应用额外的验证逻辑,因此在validation.xml 中添加以下内容:

<constraint-mappings>
    <bean class="com.example.controller.SampleController" ignore-annotations="false">
        <method name="doFoo">
            <parameter type="com.example.dto.MyEntity">
                <valid />
                <constraint annotation="com.example.validation.ValidEntity" />
            </parameter>
        </method>
    </bean>
</constraint-mappings>

com.example.validation.ValidEntity 是我要应用的约束注解。

我的问题是,只有在MyEntity 中定义的@NotNull 检查成功通过时,才会调用此附加约束。如果fieldA 为空,则忽略ValidEntity 约束,客户端会收到不完整的验证结果。我错过了什么?

【问题讨论】:

    标签: java spring-boot javax.validation


    【解决方案1】:

    我对此并不完全确定,因为我从未使用过 validation.xml 文件。

    但是,我会说 Spring 首先创建对象,然后应用验证。 @NotNull 验证在创建实例时执行。这意味着如果验证失败,构造将抛出异常,Spring 甚至不会尝试检查您的约束(在我看来这是有道理的)。

    我认为您可以通过使用约束创建注释并在课堂上使用它来“修复”它。如果我是对的,两个注释都会被检查并且抛出的异常将包含所有错误。

    这只是一个猜测。让我知道它是否有效。

    【讨论】:

    • 很遗憾,控制器和 POJO 都是由代码生成器创建的,所以我无法修改它们的源代码。
    【解决方案2】:

    我不知道是否有一种简单的方法可以配置验证器,以便在第一次或两者都失败时聚合来自注释和 XML 配置的约束违规。

    正如您的代码所证明的那样,Hibernate Validator 可以使用混合注释和 XML 配置,但缺少针对该特定情况的文档暗示至少不建议这样做。

    使用 XML 配置文件时,默认优先于注解。 ignore-annotations 用于克服这个问题(文本突出显示是我的):

    ignore-annotations 设置为 true 意味着约束 放置在已配置 bean 上的注释将被忽略。默认为 此值为 trueignore-annotations 也可用于节点 class, fields, getter, constructor, method, parameter, cross-parameterreturn-value如果没有在这些级别上明确指定 配置的 bean 值适用

    Using Hibernate Validator to Cover Your Validation Needs 文章指出:

    字段的默认值为ignore-annotations=”false”。这表示 默认情况下,字段的注释更强(这是 当然,在您表示 bean 本身不会忽略之后 注释)。如果您不希望 XML 比您拥有的更强大 以ignore-annotations=”true”表示,

    似乎可以禁用在 XML 中配置的特定字段的注释配置。

    在注解和 XML 配置之间切换的另一种解决方案是使用Grouping constraints

    我不确定上述任何内容是否对您有用,但如果可能的话,我可能会切换到单个配置(XML,假设注释配置来自您无法修改的外部库)并强制执行它无处不在,而不是依赖于未记录的功能。

    【讨论】:

      猜你喜欢
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2017-02-18
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      相关资源
      最近更新 更多