当前位置: 首页 > 面试题库 >

如何结合验证两个或多个字段?

袁智明
2023-03-14
问题内容

我正在使用JPA 2.0 /hibernate验证来验证我的模型。我现在遇到一种情况,必须验证两个字段的组合:

public class MyModel {
    public Integer getValue1() {
        //...
    }
    public String getValue2() {
        //...
    }
}

该模型是无效的,如果都getValue1()getValue2()都null和其他有效。

如何使用JPA 2.0 / Hibernate执行这种验证?使用简单的@NotNull注释,两个吸气剂都必须为非null才能通过验证。


问题答案:

对于多属性验证,应使用类级别的约束。摘自 Bean Validation Sneak Peek第二部分:自html" target="_blank">定义约束:

类级别的约束

你们中有些人对应用跨越多个属性的约束或表达依赖于多个属性的约束的能力表示担忧。经典示例是地址验证。地址具有复杂的规则:

  • 街道名称在某种程度上是标准名称,并且一定要有长度限制
  • 邮政编码结构完全取决于国家/地区
  • 该城市通常可以与邮政编码相关联,并且可以进行一些错误检查(前提是可以使用验证服务)
  • 由于这些相互依赖关系,一个简单的属性级别约束确实可以满足要求
  • Bean验证规范提供的解决方案有两个方面:
  • 它提供了通过使用组和组序列来强制在另一组约束之前应用一组约束的功能。下一个博客条目将涵盖该主题
  • 它允许定义类级别的约束
    类级别约束是规则约束(注释/实现二重奏),适用于类而不是属性。换句话说,类级别的约束在中接收对象实例(而不是属性值)isValid。

```
@AddressAnnotation
public class Address {
@NotNull @Max(50) private String street1;
@Max(50) private String street2;
@Max(10) @NotNull private String zipCode;
@Max(20) @NotNull String city;
@NotNull private Country country;

...

}

@Constraint(validatedBy = MultiCountryAddressValidator.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AddressAnnotation {
String message() default “{error.address}”;
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}

public class MultiCountryAddressValidator implements ConstraintValidator {
public void initialize(AddressAnnotation constraintAnnotation) {
// initialize the zipcode/city/country correlation service
}

/**
 * Validate zipcode and city depending on the country
 */
public boolean isValid(Address object, ConstraintValidatorContext context) {
    if (!(object instanceof Address)) {
        throw new IllegalArgumentException("@Address only applies to Address");
    }
    Address address = (Address) object;
    Country country = address.getCountry();
    if (country.getISO2() == "FR") {
        // check address.getZipCode() structure for France (5 numbers)
        // check zipcode and city correlation (calling an external service?)
        return isValid;
    } else if (country.getISO2() == "GR") {
        // check address.getZipCode() structure for Greece
        // no zipcode / city correlation available at the moment
        return isValid;
    }
    // ...

``` }
}

高级地址验证规则已被排除在地址对象之外,并由实现 MultiCountryAddressValidator。通过访问对象实例,类级别的约束具有很大的灵活性,并且可以验证多个相关属性。请注意,这里的排序不包括方程式,我们将在下一篇文章中再次讨论。

专家组讨论了多种属性支持方法:与其他涉及依赖的属性级别方法相比,我们认为类级别约束方法既提供了足够的简便性又提供了灵活性。欢迎您提供反馈。



 类似资料:
  • 我有两个数字字段来收集用户的数据。需要使用codeigniter表单验证类对其进行验证。 条件: 第一个字段可以为零 第二字段不能为零 第一字段不应等于第二字段 第二字段应大于第一字段 目前我使用 美元这个- 美元这个- 但是,如何验证上述第3和第4个条件? 提前谢谢。

  • 因此,我调用一个服务“ServiceA”,它通过webclient进行外部调用,返回一个mono,然后我想调用另一个服务“serviceB”,它也进行类似的外部调用,这次从“ServiceA”mono传递一些数据,可能还有一些其他外部参数。 目前我有这个实现。 但是我面临线程池的挑战,因为 那么,将这两个单声道结合起来以获得良好性能的最佳策略是什么? 以及在调用内部mono“serviceB”时分

  • 问题内容: 在elasticsearch中,如果我有带有 属性的文档说,还有其他一些属性。 我需要以以下方式查询结果 基本上,我需要doc_count可用的所有组合。使用该结果,可以说 在Foo = foo1,Bar = bar1,Baz = baz1,Qux = qux1的情况下,有20个文档/记录。 粗略的方法是,在聚合内部使用聚合(在这种情况下为4次)。 应该有一些更简单的方法可以做到这一点

  • 我有两个日期字段来收集用户的数据。需要使用codeigniter表单验证类来验证它。 场景: > 第一个日期字段可以为空 第二个日期字段不能为空 第一个日期字段不应大于今天的日期 第二个日期字段应大于第一个日期字段 美元这个- 美元这个- 回调函数是:

  • 我如何验证一个列表的值跨字段,其中至少一个单一的值必须设置(不是零) 我需要验证至少有一个字段被输入(例如总数不是零) 我遇到的问题是,当任何一个字段发生更改时,validator::total_cost不会重新评估所有正在验证的字段。 在“任意”输入中键入正确的值需要告诉“所有”其他输入,以便根据新的计算字段重新估价! 任何帮助都将不胜感激。 (我的电视机大得多) 我正在使用的标记 AnyVal

  • 问题内容: 我有一个库存表,我想创建一个报告,以显示订购商品的频率。 “库存”表: 基本上,我需要将这两个查询结合在一起。 查询打印库存余额: 打印销售统计信息的查询 我认为某种JOIN可以完成这项工作,但我不知道如何将查询粘合在一起。 所需的输出: 这仅是示例。也许我将需要添加更多条件,因为有更多列。是否存在将多个查询组合在一起的通用技术? 问题答案: