大家好我用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);
}
application 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>
答案 0 :(得分:6)
使用:
<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);
}
答案 1 :(得分:4)
WEB-INF / XXX-XX.xml]:通过构造函数参数表达的不满意的依赖关系,类型为[org.springframework.security.web.context.SecurityContextRepository]的索引为0:不明确的构造函数参数类型 - 您是否指定了正确的bean引用作为构造函数参数?
解决方法是从构造函数参数中删除name属性(如果存在)。只保留参考。 它会起作用。
答案 2 :(得分:2)
ClientDaoImpl
类中定义的构造函数需要类型为Class<Client>
的参数。但是在 applicationContext.xml 中,您将实例客户端对象设置为传递给构造函数。
更改构造函数以接收对象并将类传递给super,例如:
public ClientDaoImpl(Client client) {
super(client.getClass());
}
答案 3 :(得分: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的constructor-args列表中的索引。尽管通常会命令它们相同,但不一定必须如此。 (并且在代码投入生产一段时间之后,上下文XML和它背后的Java代码可能会遭受一些“影响”。)也就是说,我刚要更改的代码大约有4-5年的历史了,这这个问题刚出现在最近的版本中。