gpt4 book ai didi

java - 尝试注入(inject)泛型类时未找到依赖项

转载 作者:行者123 更新时间:2023-12-02 00:11:52 25 4
gpt4 key购买 nike

我开发了一个 GenericDAO 接口(interface),它具有两种泛型类型:实体和主键类型:

public interface GenericDAO<E, PK extends Serializable> {
PK save(E newInstance);
void update(E transientObject);
//typical dao methods
}

然后我在 hibernate 4 中为它们提供了一个实现:

@Transactional
@Component
@Repository
public abstract class GenericDAOHibernate4<E, PK extends Serializable> implements GenericDAO<E, PK> {
public PK save(E newInstance) {
return (PK) factory.getCurrentSession().save(newInstance);
}
public E findById(PK id) {
return (E) factory.getCurrentSession().get(getEntityClass(), id);
}
//method implementations
}

然后我只需要创建扩展这个抽象类的具体类:

@Component
@Transactional
@Repository
@Qualifier("userDAO")
public class UserDAO extends GenericDAOHibernate4<User, Long> {

@Autowired
public UserDAO(SessionFactory factory) {
super(factory);
}

@Override
protected Class<User> getEntityClass() {
return User.class;
}

}

然后我在需要时以这种方式注入(inject)具体的 DAO:

public class UserService extends GenericService<User> {
@Autowired
public UserService(@Qualifier("userDAO") GenericDAO<User, Long> dao) {
super(dao);
}

但是,如果我需要向具体 dao 添加另一个方法,从而注入(inject)具体类,spring 无法找到依赖项。启动时失败:

public class UserService extends GenericService<User> {
@Autowired
public UserService(@Qualifier("userDAO") UserDAO dao) {
super(dao);
}

出现此错误:

Could not instantiate bean class [ddol.rtdb.services.UserService]: No default constructor found; nested exception is java.lang.NoSuchMethodException: ddol.rtdb.services.UserService.()

我该如何注入(inject)?

最佳答案

如果一个类实现了一个接口(interface),则该类的 bean 只能使用接口(interface)类型进行 Autowiring ,而不能使用具体的类类型。自 UserDao实现GenericDAO<User, Long>接口(interface),当您使用该接口(interface) Autowiring 时,它会被正确 Autowiring 。当您尝试使用具体类 Autowiring 时,Spring 无法找到依赖项,然后它会查找 UserService 的无参数构造函数。并未能在未找到任何错误时给出特定错误。

一般来说,使用具体类注入(inject)依赖项不是一个好主意,因为它与模块紧密耦合。正确的方法是为每个 DAO 类提供一个接口(interface),并让它们的实现扩展 GenericDAOHibernate4 .

public interface GenericDAO<E, PK extends Serializable> {
PK save(E newInstance);
void update(E transientObject);
//typical dao methods
}

public interface UserDAO extends GenericDAO<User, Long> {
List<User> findUsersByFirstname(String firstName);
}

@Component
@Transactional
@Repository
@Qualifier("userDAO")
public class UserDAOImpl extends GenericDAOHibernate4<User, Long>
implements UserDAO {

@Autowired
public UserDAO(SessionFactory factory) {
super(factory);
}

@Override
protected Class<User> getEntityClass() {
return User.class;
}

List<User> findUsersByFirstname(String firstName) {
//provide implementation here
}

}

public class UserService extends GenericService<User> {
@Autowired
public UserService(@Qualifier("userDAO") UserDAO dao) {
super(dao);
}
}

关于java - 尝试注入(inject)泛型类时未找到依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12663330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com