当前位置: 首页 > 知识库问答 >
问题:

Spring验证:未调用方法参数约束

拓拔高畅
2023-03-14

每个人

因此,我有一个SpringBoot应用程序,它带有一个控制器,该控制器有几种方法,将以下POJO作为参数:

package com.example.dto;

import lombok.Data;

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

   private String fieldB;
}

对于其中一个控制器endpoint,我想应用额外的验证逻辑,因此在验证中。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。实例验证。ValidEntity是我想要应用的约束注释。

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

共有2个答案

赫连彬炳
2023-03-14

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

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

当使用XML配置文件时,默认情况下它优先于注释。忽略注释用于克服这一点(文本高亮是我的):

忽略注释设置为true意味着忽略放置在配置bean上的约束注释。此值的默认值为true。忽略注释也可用于节点字段getter构造函数方法参数>交叉参数返回值。如果未在这些级别上显式指定,则应用配置的bean值。

使用Hibernate Validator满足您的验证需求这篇文章指出:

字段的默认值是ignore annotations=“false”。这意味着默认情况下,字段的注释更强(这当然是在您指出bean本身不会忽略注释之后)。如果你不想知道XML会比你的强大,你必须通过ignore annotations=“true”

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

在注释和XML配置之间切换的另一个解决方案是使用分组约束。

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

濮阳景天
2023-03-14

我不完全确定这一点,因为我从未使用过验证。xml文件

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

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

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

 类似资料:
  • 我在类中有一个签名为的方法。 我有一个调用方法的代码块: 如果我想测试databaseService.save(user)没有被调用,那么我如何用Mockito(3.3.3版)来做呢?

  • 我在SUT中有这段代码: 我知道模型不会为空,因为模型已经存在。因此,我希望不应该与model一起调用。因此,我需要某种的方法,以确保该方法不是用此参数调用的。现在我知道了如何进行相反的操作:如何确保/验证或任何方法本身是在的帮助下用参数调用的,但不确定当前的场景。请帮帮忙。 谢谢

  • 问题内容: 不知道为什么这不起作用。我相信你们都知道我在这里想要达到的目标。 当脚本运行时,我得到一个参考,它引用了这段代码: 我正在使用codeigniter2框架,因此如果我的表单页面对某些人没有意义,则表示歉意。 new_page.php(相关位) 并在new_page.validation.js中 任何帮助将不胜感激!欢呼的家伙 问题答案: 可能会破坏插件的正常运行。根据文档, “布尔tr

  • 我计划使用API中的 波姆。xml 位置检查。JAVA 位置验证器。JAVA 位置JAVA 机器人。JAVA 一个pp.java 这里的问题是,上的

  • 我有以下spring cloud合同: 为了从服务器生成动态响应,我在响应处调用get响应。例如,原因可能是来自数据库的自动生成的id。从get响应ForFindTeamRletByFilters()生成的字符串是一个有效的JSON,不幸的是,它被忽略,并且在测试运行时返回始终为true。 当我用如下静态响应替换execute方法时,我注意到了这一点: 在这种情况下,响应被正确验证,如果不匹配,则

  • 我希望对spring服务的参数使用java bean验证注释。考虑以下服务: