Java 如何在ConstraintValidator内执行@Entity查询

Java 如何在ConstraintValidator内执行@Entity查询,java,spring-boot,spring-data-jpa,hibernate-validator,Java,Spring Boot,Spring Data Jpa,Hibernate Validator,这种情况是,在持久化日志实体类之前,应该检查其属性字符串描述,如果它至少包含在非法词实体类中找到的单词。以下是两个实体类的映射: // Log.java @Entity public class Log { @GeneratedValue(strategy=GenerationType.SEQUENCE) @Id private Long id; @NotContainingIllegalWords private String description;

这种情况是,在持久化
日志
实体类之前,应该检查其属性
字符串描述
,如果它至少包含在
非法词
实体类中找到的单词。以下是两个实体类的映射:

// Log.java
@Entity
public class Log {
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Id
    private Long id;

    @NotContainingIllegalWords
    private String description;
}

// IllegalWord.java
@Entity
public class IllegalWord {
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Id
    private Long id;
    private String word;
}
由于我将对
IllegalWord
实体类执行
select*
,因此我为其创建了一个存储库类:

// IllegalWordRepository.java
@Repository
public interface IllegalWordRepository extends CrudRepository<IllegalWord, Long> {}
我以为会像那样直截了当。但是语句
illegalWordRepository.findAll()
抛出错误,因为
illegalWordRepository
变量为null。注意,我在前面的语句中尝试检查它是否为
null

我假设我在repository类中有错误的编码,所以我尝试在
@服务
注释类中使用
@Autowired private IllegalWordRepository IllegalWordRepository
,令人惊讶的是,它被正确地注入其中(例如,不
null
):

因此,我想
IllegalWordRepository
repository类没有什么问题。只是它没有被注入到
notcontainingillegolwordsvalidator
验证程序类中,正如我在
@Autowired
注释中所希望的那样(如果这就是
@Autowired
注释的功能,很抱歉,我是Spring框架中的新手)

如果在
ConstraintValidator
实例中有一种正确的方法来执行@Entity查询,请告诉我

相关未回答的SO问题:


尝试失败:

我试图用
@Configurable
注释
notcontainingillegolwordsvalidator
类,如下所示:

@Configurable(autowire=Autowire.BY_NAME, preConstruction=true)
public class NotContainingIllegalWordsValidator implements ConstraintValidator<NotContainingIllegalWords, Object> {
@可配置(autowire=autowire.BY_NAME,preConstruction=true)
公共类NotContainingIllegalWordsValidator实现ConstraintValidator{
但是,
illegalWordRepository
属性仍然是
null

从my到类似的:

@Autowired在ConstraintValidator实现中正常工作的最低设置是在Spring@配置中使用此bean:

@Bean
public Validator defaultValidator() {
    return new LocalValidatorFactoryBean();
}

这是项目

因为您的验证器不是由Spring初始化的,所以您不能向其中注入任何内容。您必须通过静态变量访问
ApplicationContext

@SpringBootApplication
public class MyApplication {

  private static ApplicationContext applicationContext;

  public static void main(final String[] args) {
    applicationContext = SpringApplication.run(MyApplication.class, args);
  }
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }
}
在您的
约束验证器中:

public class NotContainingIllegalWordsValidator implements ConstraintValidator<NotContainingIllegalWords, Object> {
  public boolean isValid(String value, ConstraintValidatorContext cxt) {
    ApplicationContext applicationContext = MyApplication.getApplicationContext();
    IllegalWordRepository illegalWordRepository = applicationContext.getBean(IllegalWordRepository.class);
    ...
  }
}
公共类NotContainingIllegalWordsValidator实现ConstraintValidator{
公共布尔值有效(字符串值,ConstraintValidatorContext cxt){
ApplicationContext ApplicationContext=MyApplication.getApplicationContext();
IllegalWordRepository IllegalWordRepository=applicationContext.getBean(IllegalWordRepository.class);
...
}
}
@SpringBootApplication
public class MyApplication {

  private static ApplicationContext applicationContext;

  public static void main(final String[] args) {
    applicationContext = SpringApplication.run(MyApplication.class, args);
  }
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }
}
public class NotContainingIllegalWordsValidator implements ConstraintValidator<NotContainingIllegalWords, Object> {
  public boolean isValid(String value, ConstraintValidatorContext cxt) {
    ApplicationContext applicationContext = MyApplication.getApplicationContext();
    IllegalWordRepository illegalWordRepository = applicationContext.getBean(IllegalWordRepository.class);
    ...
  }
}