【问题标题】:Hibernate/Spring Custom Validations w/ Autowired repository带有 Autowired 存储库的 Hibernate/Spring 自定义验证
【发布时间】:2021-06-27 20:55:57
【问题描述】:

我正在构建一个自定义约束验证器,并不断收到HV000028: Unexpected exception during isValid call.]

奇怪的是,findById 方法在控制台上返回并打印了正确的数据,但出现了上述错误。我怎样才能使它没有错误?

@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@Validated
public class invitecontroller {

    @PostMapping("/v1/invite")
    public void invite(@Valid @RequestBody invite invite){
    }

}
@inviteconstraints
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class invite {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long inviteid;

    private String type;
    private Long propertyid;
    private Date moveindate;
    
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "inviteid")
    private List<applicant> applicants;

}
public class inviteconstraint implements ConstraintValidator<inviteconstraints, invite> {
  
    @Autowired propertyrepository propertyrepository;

    @Override
    public boolean isValid(invite invite, ConstraintValidatorContext context) {
        
       
        property property = propertyrepository.findById(1L).get();  

        ^^^ **Error Happens Here** ^^^


        return true;
    }

    @Override 
    public void initialize(inviteconstraints constraintannotation) {
    }

}
@Target(  { ElementType.TYPE } )  
@Retention(RetentionPolicy.RUNTIME)  
@Constraint(validatedBy = inviteconstraint.class)
public @interface inviteconstraints {
 
    public String message() default "Validator Failed"; 
    public Class<?>[] groups() default {};  
    public Class<? extends Payload>[] payload() default {}; 
    
}

【问题讨论】:

    标签: spring-boot hibernate-validator customvalidator


    【解决方案1】:

    自动装配在这种情况下不起作用,因此您在这个 (propertyRepository) 点遇到错误。 为了使自动装配工作,您需要进行另一个配置。使用此功能后,自动装配将成功。

    @Component
    public class HibernateValidatorCustomizer implements HibernatePropertiesCustomizer {
    
        private final ObjectProvider<Validator> provider;
    
        public HibernateValidatorCustomizer(ObjectProvider<Validator> provider) {
            this.provider = provider;
        }
    
        public void customize(Map<String, Object> hibernateProperties) {
            Validator validator = provider.getIfUnique();
            if (validator != null) {
                hibernateProperties.put("javax.persistence.validation.factory", validator);
            }
        }
    }
    

    【讨论】:

    • 很奇怪,就像一个魅力。只需将其弹出到另一个文件中并添加所有内容的导入,并且一切似乎都在工作。我只是不明白它在做什么。
    猜你喜欢
    • 2013-08-27
    • 1970-01-01
    • 2014-10-25
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多