2013-06-30 4 views
6

Chào các bạn tôi đã tạo một ứng dụng web đơn giản bằng cách sử dụng ngủ đông và mùa xuân và tôi muốn triển khai một lớp trừu tượng có chứa các hoạt động crud nhưng tôi có lỗi:Phụ thuộc không thỏa mãn được thể hiện qua đối số hàm tạo với chỉ mục 0 của loại [java.lang.Class]

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

    } 

ứng dụng 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> 

Trả lời

6

Sử dụng:

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

mùa xuân sẽ "diễn viên" chuỗi đến lớp học. Sau đó, bạn có thể loại bỏ bean khách từ XML.

Hoặc loại bỏ tham số này từ ClientDaoImpl của bạn, bởi vì nó là vô ích (Nó có thể là duy nhất loại này, vì vậy không có lý do gì để làm cho nó một tham số)

public ClientDaoImpl() { 
    super(com.xxx.Client.class); 
} 
+0

cảm ơn bạn rất nhiều, nó hoạt động –

2

Các nhà xây dựng theo quy định tại các lớp ClientDaoImpl hy vọng một tham số có kiểu Class<Client>. Nhưng trong ứng dụng applicationContext.xml bạn đặt đối tượng ứng dụng khách mẫu được truyền cho hàm tạo.

Thay đổi constructor để nhận đối tượng và vượt qua các lớp học để các siêu, ví dụ:

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

    } 
+0

cảm ơn bạn rất nhiều! –

3

WEB-INF/xxx- XX.xml]: Phụ thuộc không thỏa mãn được biểu diễn thông qua đối số hàm tạo với chỉ mục 0 của kiểu [org.springframework.security.web.context.SecurityContextRepository]: Các kiểu đối số hàm tạo không rõ ràng - bạn có chỉ định tham chiếu bean chính xác làm đối số hàm tạo không?

Giải pháp là xóa thuộc tính tên khỏi đối số hàm tạo (nếu có). Chỉ giữ tham chiếu. Nó sẽ hoạt động.