我有一个spring boot项目,它有一个CrudRepository,一个Entity和一个Controller.我基本上试图根据传递给Controller的数据来持久化实体.
要做到这一点,我正在使用spring-boot-starter-jpa.我的实体使用JSR-303注释进行注释,在将数据传递给CrudRepository以进行持久化之前,在控制器中对其进行检查.
控制器方法:
@RequestMapping(value = "users", method = { RequestMethod.POST })
public SuccessfulResponse<User> addUser(@Valid @RequestBody User user, BindingResult validation) {
if (validation.hasErrors()) {
throw new ValidationException(validation);
}
User saved = this.users.save(user);
return new SuccessfulResponse<User>(saved);
}
Run Code Online (Sandbox Code Playgroud)
实体:
@Entity /* JPA */
public class User {
@Id /* JPA */
@Column(name="email_address", nullable=false, length=255) /* JPA */
@UserUnique
private String emailAddress;
}
Run Code Online (Sandbox Code Playgroud)
我的问题的原因是UserUnique注释.它的验证器如下所示:
public class UserUniqueValidator implements ConstraintValidator<UserUnique, String> {
private UserRepository users;
@Autowired …Run Code Online (Sandbox Code Playgroud) 这些罐子都是新发布的,并且拥有最新的Java EE应用程序解决方案.但是我在hibernate.cfg.xml中指定hibernate监听器时遇到了问题.
在春季3.1.0之前,LocalSessionFactroyBean持有一个保存eventlisteners的属性.但是使用3.1.0.release没有eventlisteners地图.现在我无法在saveorupdate,postload等上保持模态对象的跟踪,因为它们不是由Spring配置的.你有想法解决这个问题吗?
我有一个基于Spring的webapp.我在控制器中使用了几个带注释@Repository,@ Transaction的存储库类.那部分工作正常.
我创建了一个Custom Constraint Validator,它必须访问存储库.现在我无法理解为什么Repository为null.我尝试使用@Component注释来注释验证器.我的基本包包含所有这些类是在xml的一部分.那么我还应该做些什么来确保存储库依赖注入工作.这就是我的Constraint验证器的样子.
public class DonorTypeExistsConstraintValidator implements
ConstraintValidator<DonorTypeExists, DonorType> {
@Autowired
private DonorTypeRepository donorTypeRepository;
@Override
public void initialize(DonorTypeExists constraint) {
}
public boolean isValid(DonorType target, ConstraintValidatorContext context) {
System.out.println("donorType: " + target);
if (target == null)
return true;
try {
if (donorTypeRepository.isDonorTypeValid(target.getDonorType()))
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public void setDonorRepository(DonorTypeRepository donorTypeRepository) {
this.donorTypeRepository = donorTypeRepository;
}
}
Run Code Online (Sandbox Code Playgroud)
更新
包扫描配置:
<context:annotation-config />
<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />
<context:component-scan …Run Code Online (Sandbox Code Playgroud) 从Spring Boot 2.0.0 M2升级到2.0.0 M6后,我的Hibernate拦截器实现不再起作用。
我以前的实现:
@Configuration
public class HibernateConfiguration extends HibernateJpaAutoConfiguration {
private HibernateStatisticsInterceptor hibernateStatisticsInterceptor;
public HibernateConfiguration(DataSource dataSource, JpaProperties jpaProperties, ObjectProvider<JtaTransactionManager> jtaTransactionManager, ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers, ObjectProvider<List<SchemaManagementProvider>> providers, HibernateStatisticsInterceptor hibernateStatisticsInterceptor) {
super(dataSource, jpaProperties, jtaTransactionManager, transactionManagerCustomizers, providers);
this.hibernateStatisticsInterceptor = hibernateStatisticsInterceptor;
}
@Override
protected void customizeVendorProperties(Map<String, Object> vendorProperties) {
vendorProperties.put("hibernate.session_factory.interceptor", hibernateStatisticsInterceptor);
}
}
Run Code Online (Sandbox Code Playgroud)
但是使用M5或M6时,HibernateJpaAutoConfiguration类已更改,并且不再扩展JpaBaseConfiguration。
我尝试为每个YAML配置文件添加拦截器,但是它不起作用。
我的拦截器:
@Component("hibernateStatisticsInterceptor")
public class HibernateStatisticsInterceptor extends EmptyInterceptor {
private static final long serialVersionUID = 5278832720227796822L;
private ThreadLocal<Long> queryCount = new ThreadLocal<>();
public void startCounter() {
queryCount.set(0l);
}
public …Run Code Online (Sandbox Code Playgroud) 我将尝试忽略其他细节并使其简短:
@Entity
public class User
@UniqueEmail
@Column(unique = true)
private String email;
}
@Component
public class UniqueEmailValidatior implements ConstraintValidator<UniqueEmail,String>, InitializingBean {
@Autowired private UserService userService;
@Override
public void initialize(UniqueEmail constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(userService == null) throw new IllegalStateException();
if(value == null) return false;
return !userService.isEmailExisted(value);
}
}
Run Code Online (Sandbox Code Playgroud)
这将在 Spring 中进行验证(Spring MVC@Valid或注入Validatorusing @Autowire)时起作用,一切都会好起来的。但是一旦我使用 Spring Data JPA 保存实体:
User save = userRepository.save(newUser);
Run Code Online (Sandbox Code Playgroud)
Hibernate 将尝试在UniqueEmailValidatior不注入UserServicebean 的情况下实例化一个新的。那么如何让 …