Hibernate Validator 自定义约束不起作用

Posted

技术标签:

【中文标题】Hibernate Validator 自定义约束不起作用【英文标题】:Hibernate Validator custom constraint not working 【发布时间】:2021-11-26 19:32:08 【问题描述】:

我正在尝试使用 Hibernate Validator 创建自定义约束。 如果我使用诸如@Size 之类的标准,它工作得很好并且我收到了错误消息。 但是,我的自定义一个不起作用,我不知道为什么。

这是我的代码:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;

@Target( ElementType.FIELD, ElementType.PARAMETER )
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = TestValidateur.class)



public @interface ObjectValid 


    String message() default "test";
     
    Class<?>[] groups() default ;
    Class<? extends Payload>[] payload() default ;
    

还有:

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



public  class TestValidateur implements ConstraintValidator<ObjectValid , String>  

      public void initialize(ObjectValid constraintAnnotation) 
        
      

    public boolean isValid(String NoObject, ConstraintValidatorContext ctx) 

         return false ;
    




@Column(name="NoObject")
@ObjectValid
@Size(min = 4, max = 14)
public String NoObject;

并测试验证:

import java.io.FileNotFoundException;
import java.util.Set;

import javax.persistence.EntityManager;

import org.hibernate.mapping.Component;
import org.hibernate.validator.HibernateValidator;


import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;



public class NoTest 
    private static Validator validator;

   public static void main(String[] args) throws FileNotFoundException, NoSuchMethodException, SecurityException 


       Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
       Object objectVerif = new Object("ss");
       Set<ConstraintViolation<Object>> validationErrors = validator.validate(objectVerif);
       if(!validationErrors.isEmpty())
           for(ConstraintViolation<Object> error : validationErrors)
               System.out.println(error);

       

         




如果我运行应用程序,我只会收到 @Size 的错误消息

ConstraintViolationImplinterpolatedMessage='la taille doit être comprise entre 4 et 14', propertyPath=NoObject, rootBeanClass=class tp03.Object, messageTemplate='jakarta.validation.constraints.Size.message'

如果有人知道我缺少什么,将不胜感激

谢谢

验证对象:

import java.util.ArrayList;
import java.util.Collection;

import javax.persistence.*;

import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import jakarta.validation.constraints.Size;

@Entity
@Table(name="object",indexes =  @Index(name="primary",columnList = "idObject"))

public class Object 

    
    
@Id
@GeneratedValue
@Column(name="idObject")    
private int idObject;

public int getidObject()

    return idObject;


public void SetidObject(int idObject)

    
    this.idObject=idObject;



@Column(name="NoObject")
@ObjectValid
@Size(min = 4, max = 14)
public String NoObject;


public String getNoObject()

    return NoObject;


public void SetNoObject(String NoObject)

    
    this.NoObject=NoObject;


public Object(String NoObject)
this.NoObject=NoObject;




【问题讨论】:

您好,为了完整起见,您能否分享更多已验证的对象,以便尝试重现您的问题? 感谢您的评论,我添加了更多信息 【参考方案1】:

这里的问题是javax.validation.Constraint 用于定义自定义约束,但jakarta.validation.Validator 用于执行验证,然后只验证jakarta.validation.Constraints。

如果您在ObjectValid 约束接口和TestValidateur 类中将导入从javax 更改为jakarta,则这两个约束都会正确验证。

【讨论】:

以上是关于Hibernate Validator 自定义约束不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate Validator 使用详解

java 使用 Hibernate Validator完成参数必输校验

Java Hibernate Validator JSR-303验证

Java Hibernate Validator JSR-303验证

自定义校验注解(org.hibernate.validator)

SpringBoot整合Hibernate-Validator校验器