Invalid dependency expressed in constructor argument with index 0 of type [java.lang.Class]

Hi guys, I created a simple web application using hibernate and spring, and I want to implement an abstract class containing crud operations, but I have this error:

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> 
+6
source share
4 answers

Using:

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

Spring will "distinguish" the string to the class. Then you can remove the bean client from XML.

Or remove this parameter from ClientDaoImpl because it is useless (it can only be this type, so there is no reason to make it a parameter)

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

WEB-INF / XXX-XX.xml]: unsatisfied dependency expressed through a constructor argument with an index of type 0 [org.springframework.security.web.context.SecurityContextRepository]: Ambiguous constructor argument types - did you specify the correct reference bean as constructor arguments?

The solution is to remove the name property from the constructor argument (if any). Just keep the link. He will work.

+4
source

The constructor defined in the ClientDaoImpl class expects a parameter of type Class<Client> . But in applicationContext.xml you set the instance client object instance to the constructor.

Change the constructor to get the object and pass the super class, for example:

 public ClientDaoImpl(Client client) { super(client.getClass()); } 
+2
source

Thanks @Atul. If I hadn’t just fixed the error message by deleting the name property from the XML file of the servlet context, I would never have guessed that this would work. In other words, I went from:

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

so that:

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

Less - more. In addition, the error message I received says that Unsatisfied dependency expressed through constructor parameter 1: Ambiguous argument values for parameter of type... instead of any mention of the "index" value. (Maybe this message has changed over time, as this issue is already six years old). Although this is probably obvious with careful reading, this number refers to its index found in the Java constructor , and not to the index in the list of constructor argument context files for this component. Although they will often be ordered the same, they should not be. (And after the code was in production for some time, these two files could undergo some β€œdrift”.) However, the code I just had to change is about 4-5 years old, and this problem just arose with recent build.

0
source

Source: https://habr.com/ru/post/948411/


All Articles