为了账号安全,请及时绑定邮箱和手机立即绑定

JSR 303验证,如果一个字段等于“ something”,则这些其他字段不应为null

JSR 303验证,如果一个字段等于“ something”,则这些其他字段不应为null

Helenr 2019-12-13 09:31:57
我正在使用JSR-303做一些自定义验证javax.validation。我有一个领域。而且,如果在此字段中输入了某个值,则我希望不包含其他一些字段null。我正在尝试解决这个问题。不确定我该如何称呼以帮助找到解释。任何帮助,将不胜感激。我对此很陌生。目前,我正在考虑自定义约束。但是我不确定如何从批注中测试相关字段的值。基本上我不确定如何从注释访问面板对象。public class StatusValidator implements ConstraintValidator<NotNull, String> {    @Override    public void initialize(NotNull constraintAnnotation) {}    @Override    public boolean isValid(String value, ConstraintValidatorContext context) {        if ("Canceled".equals(panel.status.getValue())) {            if (value != null) {                return true;            }        } else {            return false;        }    }}这panel.status.getValue();给我带来麻烦..不确定如何完成此任务。
查看完整描述

3 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

在这种情况下,我建议编写自定义验证器,该验证器将在类级别进行验证(以允许我们访问对象的字段),只有在另一个字段具有特定值时才需要一个字段。请注意,您应该编写通用验证器,该验证器将获取2个字段名称,并且仅使用这2个字段。要要求多个字段,您应该为每个字段添加此验证器。


使用以下代码作为想法(我尚未对其进行测试)。


验证器界面


/**

 * Validates that field {@code dependFieldName} is not null if

 * field {@code fieldName} has value {@code fieldValue}.

 **/

@Target({TYPE, ANNOTATION_TYPE})

@Retention(RUNTIME)

@Constraint(validatedBy = NotNullIfAnotherFieldHasValueValidator.class)

@Documented

public @interface NotNullIfAnotherFieldHasValue {


    String fieldName();

    String fieldValue();

    String dependFieldName();


    String message() default "{NotNullIfAnotherFieldHasValue.message}";

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

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


    @Target({TYPE, ANNOTATION_TYPE})

    @Retention(RUNTIME)

    @Documented

    @interface List {

        NotNullIfAnotherFieldHasValue[] value();

    }


}

验证器实施


/**

 * Implementation of {@link NotNullIfAnotherFieldHasValue} validator.

 **/

public class NotNullIfAnotherFieldHasValueValidator

    implements ConstraintValidator<NotNullIfAnotherFieldHasValue, Object> {


    private String fieldName;

    private String expectedFieldValue;

    private String dependFieldName;


    @Override

    public void initialize(NotNullIfAnotherFieldHasValue annotation) {

        fieldName          = annotation.fieldName();

        expectedFieldValue = annotation.fieldValue();

        dependFieldName    = annotation.dependFieldName();

    }


    @Override

    public boolean isValid(Object value, ConstraintValidatorContext ctx) {


        if (value == null) {

            return true;

        }


        try {

            String fieldValue       = BeanUtils.getProperty(value, fieldName);

            String dependFieldValue = BeanUtils.getProperty(value, dependFieldName);


            if (expectedFieldValue.equals(fieldValue) && dependFieldValue == null) {

                ctx.disableDefaultConstraintViolation();

                ctx.buildConstraintViolationWithTemplate(ctx.getDefaultConstraintMessageTemplate())

                    .addNode(dependFieldName)

                    .addConstraintViolation();

                    return false;

            }


        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) {

            throw new RuntimeException(ex);

        }


        return true;

    }


}

验证器用法示例


@NotNullIfAnotherFieldHasValue.List({

    @NotNullIfAnotherFieldHasValue(

        fieldName = "status",

        fieldValue = "Canceled",

        dependFieldName = "fieldOne"),

    @NotNullIfAnotherFieldHasValue(

        fieldName = "status",

        fieldValue = "Canceled",

        dependFieldName = "fieldTwo")

})

public class SampleBean {

    private String status;

    private String fieldOne;

    private String fieldTwo;


    // getters and setters omitted

}

注意,验证器实现使用库中的BeanUtils类,commons-beanutils但您也可以使用BeanWrapperImplSpring Framework中的类。


查看完整回答
反对 回复 2019-12-13
?
森林海

TA贡献2011条经验 获得超2个赞

定义必须验证为true的方法并将@AssertTrue注释放在其顶部:


  @AssertTrue

  private boolean isOk() {

    return someField != something || otherField != null;

  }

该方法必须以“ is”开头。


查看完整回答
反对 回复 2019-12-13
  • 3 回答
  • 0 关注
  • 659 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信