9

我使用 hibernate 和 spring 创建了一个简单的 web 应用程序,我想实现一个包含 crud 操作的抽象类,但我有这个错误:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'clientService' defined in class path resource [applicationContext.xml]: 
Cannot resolve reference to bean 'clientDao' while setting bean property 'clientDao'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'clientDao' defined in class path resource [applicationContext.xml]: 
Unsatisfied dependency expressed through constructor argument with index 0 of type [java.lang.Class]: 

通用道

public interface GenericDao<T, ID extends Serializable> {
    
    T save(T entity);
    T update(T entity);
    void delete(T entity);
    T findById(ID id);
    List<T> findAll();
    void flush();

}

GenericDaoImpl

@Transactional
public  class GenericDaoImpl<T, ID extends Serializable> implements GenericDao<T, ID> {
    
    @Autowired
    SessionFactory sessionFactory ;
    
 private Class<T> persistentClass;
     
     
    
    public GenericDaoImpl() {
    super();
}

    public GenericDaoImpl(Class<T> persistentClass) {
    super();
    this.persistentClass = persistentClass;
}

    @Transactional
    public T save(T entity) {
        this.sessionFactory.getCurrentSession().save(entity);
        return null;
    }

    @Transactional
    public T update(T entity) {
        this.sessionFactory.getCurrentSession().update(entity);
        return null;
    }

    @Transactional
    public void delete(T entity) {
        this.sessionFactory.getCurrentSession().delete(entity);
        
    }

    @SuppressWarnings("unchecked")
    @Transactional
    public T findById(ID id) {
        return  (T) this.sessionFactory.getCurrentSession().load(this.getPersistentClass(), id);
        
    }
    @SuppressWarnings("unchecked")
    @Transactional
    public List<T> findAll() {
        return   this.sessionFactory.getCurrentSession().createQuery("* from"+this.getPersistentClass().getSimpleName()).list();
    }

    @Transactional
    public void flush() {
        this.sessionFactory.getCurrentSession().flush();
        
    }

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public Class<T> getPersistentClass() {
        return persistentClass;
    }

    public void setPersistentClass(Class<T> persistentClass) {
        this.persistentClass = persistentClass;
    }
    
    

}

客户道

public interface ClientDao  extends GenericDao<Client,Integer>  {



}

ClientDaoImpl

@Transactional
@Repository("clientDao")
public class ClientDaoImpl extends GenericDaoImpl<Client,Integer>  implements ClientDao {
    
    
    

    
    
    public ClientDaoImpl(Class<Client> persistentClass) {
        super(persistentClass);
        
    }

应用程序上下文.xml

<bean id="client" class="com.webapp.model.Client"/>

  <bean id="genericDao" class="com.webapp.dao.GenericDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <bean id="clientDao" class="com.webapp.dao.ClientDaoImpl" parent="genericDao">
    <constructor-arg ref="client" />
   </bean>

 <bean id="clientService" class="com.webapp.service.ClientServiceImpl">
        <property name="clientDao" ref="clientDao" />
    </bean>
4

4 回答 4

5

利用:

<bean id="clientDao" class="com.webapp.dao.ClientDaoImpl" parent="genericDao">
<constructor-arg >com.xxx.Client</constructor-arg >

Spring 会将字符串“投射”到类中。然后,您可以从 XML 中删除客户端 bean。

或者把你的这个参数去掉ClientDaoImpl,因为没用(只能是这个类型,所以没理由把它当成参数)

public ClientDaoImpl() {
    super(com.xxx.Client.class);
}
于 2013-06-30T05:55:41.693 回答
4

WEB-INF/XXX-XX.xml]:不满足的依赖关系通过构造函数参数表示,索引为 0 类型 [org.springframework.security.web.context.SecurityContextRepository]:构造函数参数类型不明确 - 您是否指定了正确的 bean 引用作为构造函数论据?

解决方案是从构造函数参数中删除 name 属性(如果有的话)。只保留参考。它会起作用的。

于 2015-06-30T11:13:40.177 回答
3

类中定义的构造函数ClientDaoImpl需要一个类型为 的参数Class<Client>。但是在applicationContext.xml中,您将实例客户端对象设置为传递给构造函数。

更改构造函数以接收对象并将类传递给超级,例如:

public ClientDaoImpl(Client client) {
        super(client.getClass());

    }
于 2013-06-30T05:55:40.960 回答
0

感谢@Atul。如果我不只是通过从 servlet 上下文 XML 文件中删除 name 属性来修复错误消息,我永远不会猜到这会起作用。换句话说,我来自:

 <bean id="myBeanId" class="com.comp.Something">
   <constructor-arg name="userPreference" ref="preferencesDao" />
   <constructor-arg name="user" ref="userDao" />
 </bean>

至:

<bean id="myBeanId" class="com.comp.Something">
  <constructor-arg ref="preferencesDao" />
  <constructor-arg ref="userDao" />
</bean>.

即是多。此外,我收到的错误消息Unsatisfied dependency expressed through constructor parameter 1: Ambiguous argument values for parameter of type ...不是提到“索引”值。(这可能只是因为这个问题已经六岁了,所以信息随着时间的推移而改变了)。虽然仔细阅读时这可能很明显,但该数字指的是它在 Java 构造函数中找到的索引,而不是它在包含上下文文件的该 bean 的构造函数参数列表中的索引。虽然它们通常会按相同的顺序订购,但不一定非要如此。(并且在代码已经投入生产一段时间后,上下文 XML 和它背后的 Java 代码可能会出现一些“偏差”。)也就是说,我刚要更改的代码大约有 4 到 5 年的历史,而这问题刚刚出现在最近的构建中。

于 2019-04-08T19:53:22.730 回答