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);
...
}
}