【问题标题】:Validating Optional Field验证可选字段
【发布时间】:2023-04-01 18:00:01
【问题描述】:

我有以下请求 json

{
 "ParameterA":"value",
 "ParameterB":[
  {
    "key":"",
  "value":""
  },
  {
    "key":"",
  "value":""
  }
    ]
}

我正在尝试验证这个 json,我的要求是,如果 ParameterB 存在,那么列表 shd 肯定存在于内部,否则 ParameterB 是可选的。例如,如果 ParameterB 本身不存在则不会有问题.

我正在寻找同样的 java 验证注解。 我在键和值上使用了@NotNull,但无法决定在 ParameterB 上使用什么,因为它是存在列表的数组

由于它也具有数据库连接性,因此我正在使用 JPA 并进行此 REST 调用。

我在 ParameterB 上尝试了@NotEmpty,但这没有帮助。我想要一个注释,以便如果 ParameterB 本身不存在,它不会影响实际流程。跟随案例

{
 "ParameterA":"value"
}

任何建议或帮助将不胜感激。

【问题讨论】:

  • 贴出相关代码,以及得到的异常。
  • null 值与集合一起使用通常是一种不好的做法。区分null和空集合真的那么重要吗?

标签: java validation jpa custom-validators javax


【解决方案1】:

您正在寻找的验证是非标准验证。我不知道实现这种验证的现有注解。

幸运的是javax.validation 约束可以通过自定义验证规则轻松扩展:

a) 创建约束注解

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = NullOrNotEmptyValidator.class)
@Documented
public @interface NullOrNotEmpty {

    String message() default "{com.mycompany.constraints.nullornotempty}";

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

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

}

b) 实现一个验证器

import java.lang.reflect.Array;
import java.util.Map;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class NullOrNotEmptyValidator implements ConstraintValidator<NullOrNotEmpty, Object> {

    @Override
    public void initialize(NullOrNotEmpty constraintAnnotation) {
    }

    @Override
    public boolean isValid(Object object, ConstraintValidatorContext constraintContext) {

        if (object == null) {
            return true;
        }

        final Class<?> fieldClass = object.getClass();
        if (fieldClass.isArray()) {
            return Array.getLength(object) > 0;
        }

        if (Iterable.class.isAssignableFrom(fieldClass)) {
            return ((Iterable) object).iterator().hasNext();
        }

        if (Map.class.isAssignableFrom(fieldClass)) {
            return !((Map) object).isEmpty();
        }

        return false;
    }

}

c) 定义默认错误消息

这一步取决于您使用的验证引擎

带有 Hibernate Validator 示例的文章:Chapter 3. Creating custom constraints

【讨论】:

    【解决方案2】:

    尝试使用第二版 Validation API,java.util.Optional 支持它

    在此处阅读更多信息https://beanvalidation.org/2.0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 2015-01-20
      相关资源
      最近更新 更多