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]: 

GenericDao

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

}

ClientDao

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

アプリケーション context.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 は文字列をクラスに「キャスト」します。その後、クライアント Bean を XML から削除できます。

または、このパラメーターを から削除しますClientDaoImpl。これは役に立たないためです (このタイプのみを使用できるため、パラメーターにする理由はありません)。

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

WEB-INF/XXX-XX.xml]: タイプ [org.springframework.security.web.context.SecurityContextRepository] ​​のインデックス 0 を持つコンストラクター引数によって表現された満たされていない依存関係: あいまいなコンストラクター引数タイプ - コンストラクターとして正しい Bean 参照を指定しましたか引数?

解決策は、コンストラクター引数から name プロパティを削除することです (存在する場合)。参照のみを保持します。それが動作します。

于 2015-06-30T11:13:40.177 に答える
3

クラスで定義されたコンストラクターはClientDaoImpl、 type のパラメーターを想定していますClass<Client>。ただし、applicationContext.xmlでは、コンストラクターに渡されるインスタンス クライアント オブジェクトを設定します。

コンストラクターを変更して、オブジェクトを受け取り、クラスをスーパーに渡します。例:

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

    }
于 2013-06-30T05:55:40.960 に答える