参数化类上的java Spring自动连接问题
我已经为这个问题挣扎了一段时间,浏览了很多文章,但没有找到解决方案。感谢您对以下问题的帮助
我需要能够在服务类中自动连接EntityManager,但会引发异常。默认构造函数可能因为类型擦除而出现问题,因此我尝试使用带参数的构造函数来设置类型。如何自动连接用户类型的EntityManager
public interface IEntityManager<T extends IDomain<ID>, ID extends Serializable> {
T findById(ID id, boolean lock);
T save(T entity);
void delete(T entity);
}
public class EntityManager<T extends IDomain<ID>, ID extends Serializable>
implements IEntityManager<T, ID> {
private Class<T> entity;
@Autowired(required=true)
private SessionFactory sessionFactory;
/*
@SuppressWarnings("unchecked")
public EntityManager() {
this.entity = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
} */
@Autowired(required=true)
public EntityManager(Class<T> entity) {
this.entity = entity;
}
}
@Service("UserService")
@Transactional
public class UserServiceImpl implements IUserService {
@Autowired
EntityManager<User, Integer> entityManager;
}
以下是例外:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserService': Injection of autowired dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.test.dummy.persistence.manager.EntityManager com.test.dummy.service.UserServiceImpl.entityManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.test.dummy.persistence.manager.EntityManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
# 1 楼答案
EntityManager类上可能缺少@Component注释
自动连线构造函数需要一个未注入的类实体
试试看
# 2 楼答案
Spring无法推断它需要在
EntityManager
的构造函数中注入User.class
,以满足UserServiceImpl
中的深度如果您使用的是Spring 4,则可以定义类型为
EntityManager<User, Integer>
的bean:编辑: 或者定义一个BeanDefinitionRegistryPostProcessor来检查需要EntityManager作为依赖项的bean,确定所需类型,为所需类型构造新的EntityManager bean,并将其添加到bean注册表
最后,看起来您实际需要的是使用Spring Data Jpa,它本质上允许您通过定义如下接口来定义参数化DAO:
您可以启用它:
然后注入
UserRepository
:Spring将注入一个基本的DAO实现