根据其他字段 javax.validation 的条件进行选项的字段验证

2024-04-20

如果存在另一个字段,我需要执行字段验证(它可以是值之一)。

import javax.validation.*;

class Person {

    @NotBlank
    private String name;

    private Long groupId;

    @Valid // if group id is not null, select one from available.
    private String specialization;

    // getters, setters.
}

class PersonValidaionLogic {

    @Autowired
    private SpecializationService specializationService;

    public void validatePerson(final Person person) {
        Long groupId = person.getGroupId();
        if (groupId != null) {
            Set<String> availableSpecializations = specializationService.getByGroupId(groupId);
            if (!availableSpecializations.contains(specialization)) {
                addValidationError("specialization is not valid");
            }
        }
    }
}

有一个关于如何验证类中的多个字段具有相互条件的很好的答案 https://stackoverflow.com/questions/1972933/cross-field-validation-with-hibernate-validator-jsr-303.

我该如何通过specializationService and groupId给验证器。


欢迎分享您的解决方案或想法!这就是我解决这个问题的方法。

我使用了问题中链接中的想法,但以更简单的方式。

首先我解决了一个问题如何将 Spring 组件或服务传递给验证器 https://stackoverflow.com/questions/55635585/javax-validator-with-spring-component。我使用了一个包含服务静态引用的组件。

其次,我按照链接中的描述验证了整个对象。

这是代码!

1)创建注释@PersonConstraint并穿上Person班级。 这可能有帮助https://www.baeldung.com/javax-validation-method-constraints https://www.baeldung.com/javax-validation-method-constraints

@Target({ TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = PersonValidator.class)
public @interface PersonConstraint {

    String message() default "Specialization is not valid";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

    CaseMode value();
}

2) 保存对服务的静态引用的组件。

@Component // Spring component.
class ServiceHolderComponent {

    private static SpecializationService SPECIALIZATION_SERVICE;

    @Autowired
    public ServiceHolderComponent(final SpecializationService specializationService) {
        GROUP_SERVICE = Validate.notNull(groupService); //apache lib
    }

    public static SpecializationService getSpecializationService() {
        return SPECIALIZATION_SERVICE;
    }
}

3)和个人验证器

public class PersonValidator implements ConstraintValidator<PersonConstraint, Person> {

    private final SpecializationService specializationService;

    public UserDynamicEnumValidator() {
        this(ServiceHolderComponent.getSpecializationService());
    }

    public UserDynamicEnumValidator(final SpecializationService specializationService) {
        this.specializationService = specializationService;
    }

    @Override
    public boolean isValid(final Person person, final ConstraintValidatorContext context) {
        final Long groupId = person.getGroupId();
        if (groupId == null) {
            return true; // We consider it valid.
        }

        final String specialization = person.getSpecializat();
        if (StringUtils.isEmpty(specialization)) {
            return true; // We consider it valid.
        }

        // I changed the code of the service, so it returns a set of strings - projection query and collectors to set.
        final Set<String> availableSpecializationValuesByGroup = specializationService.findByValue(groupId);

        if (!availableSpecializationValuesByGroup.contains(specialization)) {
            // To display custom message
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate("Specialization is not valid").addConstraintViolation();
            return false;
        }

        return true;
    }
}

要显示一个验证器中的自定义消息 https://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html/validator-customconstraints.html#example-implementing-classlevel-constraint检查这个

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据其他字段 javax.validation 的条件进行选项的字段验证 的相关文章

  • 存根方法时出现 InvalidUseOfMatchersException

    我有这个 TestNG 测试方法代码 InjectMocks private FilmeService filmeService new FilmeServiceImpl Mock private FilmeDAO filmeDao Bef
  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • createImage(int width, int height) 的问题

    我有以下代码 作为游戏的一部分每 10 毫秒运行一次 private void gameRender if dbImage null createImage returns null if GraphicsEnvironment isHea
  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • 通往楼梯顶部的可能路径

    这是一个非常经典的问题 我听说谷歌在他们的面试中使用过这个问题 问题 制定一个递归方法 打印从楼梯底部到楼梯顶部的所有可能的独特路径 有 n 个楼梯 您一次只能走 1 步或 2 步 示例输出 如果它是一个有 3 级楼梯的楼梯 1 1 1 2
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数

随机推荐