java - Hibernate 验证注解——验证至少一个字段不为空

标签 java hibernate annotations validation

有没有一种方法可以使用定义的注解来定义 Hibernate 验证规则 here , 声明至少一个字段不应为空?

这将是一个假设的例子(@OneFieldMustBeNotNullConstraint 并不真正存在):

@Entity
@OneFieldMustBeNotNullConstraint(list={fieldA,fieldB})
public class Card {

    @Id
    @GeneratedValue
    private Integer card_id;

    @Column(nullable = true)
    private Long fieldA;

    @Column(nullable = true)
    private Long fieldB;

}

在图示的情况下,fieldA 可以为 null 或 fieldB 可以为 null,但不能同时为 null。

一种方法是创建我自己的 validator ,但如果它已经存在我想避免。如果您已经制作了一个 validator ,请分享一个 validator ...谢谢!

最佳答案

我终于写出了整个 validator :

import static java.lang.annotation.ElementType.TYPE;
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.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;

import org.apache.commons.beanutils.PropertyUtils; 

@Target( { TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = CheckAtLeastOneNotNull.CheckAtLeastOneNotNullValidator.class)
@Documented
public @interface CheckAtLeastOneNotNull {
    
     String message() default "{com.xxx.constraints.checkatleastnotnull}";

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

     Class<? extends Payload>[] payload() default {};
        
     String[] fieldNames();
        
     public static class CheckAtLeastOneNotNullValidator implements ConstraintValidator<CheckAtLeastOneNotNull, Object> {
            
         private String[] fieldNames;

         public void initialize(CheckAtLeastOneNotNull constraintAnnotation) {
             this.fieldNames = constraintAnnotation.fieldNames();
         }

         public boolean isValid(Object object, ConstraintValidatorContext constraintContext) {

             if (object == null) {
                 return true;
             }
             try { 
                 for (String fieldName:fieldNames){
                     Object property = PropertyUtils.getProperty(object, fieldName);
                        
                     if (property != null) return true;
                 }
                 return false;
             } catch (Exception e) {
                 return false;
             }
         }
     }
}

使用示例:

@Entity
@CheckAtLeastOneNotNull(fieldNames={"fieldA","fieldB"})
public class Reward {

    @Id
    @GeneratedValue
    private Integer id;

    private Integer fieldA;
    private Integer fieldB;

    [...] // accessors, other fields, etc.
}

关于java - Hibernate 验证注解——验证至少一个字段不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12211734/

相关文章:

java - 如何从另一个方法获取变量的值而不将其作为参数传递?

hibernate - 你总是在 Hibernate 中使用二级缓存吗?

mongodb - spring data mongodb 按集合查找

java - JPA (Hibernate) : "ORA-02289 Sequence does not exist", 但确实如此

java - 是否值得创建自定义注释来表明方法只是有助于提高可读性?

java - 修改 JPA 查询中的属性名称

java - 将热交换代理与 JBoss 结合使用 (Jboss Developer Studio)

java - 网络分页与 arch 库中的 pagedList

java - 如何创建动态二维数组并在其中存储打乱数组

oracle - JPQL CURRENT_TIMESTAMP 偏移 2 小时