Insatisfait de la dépendance exprimée à travers argument du constructeur avec l'index 0 de type [java.lang.Class]
Salut les gars, j'ai créé une simple application web en utilisant hibernate et spring et je veux implémenter une classe abstraite qui contient les opérations crud, mais j'ai cette erreur :
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>
Vous devez vous connecter pour publier un commentaire.
Utilisation:
Le printemps de "fonte" la chaîne de la classe. Ensuite, vous pouvez supprimer le client de la fève de XML.
Ou supprimer ce paramètre à partir de votre
ClientDaoImpl
, parce que c'est inutile (Il peut être seulement de ce type, alors il n'y a pas de raison d'en faire un paramètre)Solution est de supprimer le nom de la propriété à partir argument du constructeur(si elle existe). Seulement de conserver la référence.
Il va travailler.
Le constructeur défini dans la
ClientDaoImpl
classe attend un paramètre de typeClass<Client>
. Mais dans le applicationContext.xml vous définissez l'instance de l'objet client pour être transmis au constructeur.Modifier le constructeur de recevoir l'objet et passer de la classe à la super, exemple:
Grâce à @Atul. Avais-je pas juste ce correctif le message d'erreur en supprimant le nom de la propriété de la servlet contexte fichier XML, je n'aurais jamais deviné ce serait le travail. En d'autres termes, je suis allé à partir de:
à:
Moins est plus. Aussi, le message d'erreur je me suis dit
Unsatisfied dependency expressed through constructor parameter 1: Ambiguous argument values for parameter of type ...
plutôt que toute mention d'un "indice" de la valeur. (C'est peut être juste que le message a changé au fil du temps étant donné que cette question est de six ans maintenant). Alors que c'est probablement évident lors de la lecture de soin, que nombre est en se référant à son index, comme dans la Java constructeur, pas son index dans le contexte d'un fichier de liste de constructeur-les arguments pour que les haricots. Alors qu'ils sont souvent commandé le même, ils n'ont pas à l'être. (Et d'après le code a été en production pendant un certain temps, le contexte XML et le code Java derrière elle pourrait subir quelques "dérive.") Cela dit, le code que j'ai juste eu à modifier est d'environ 4-5 ans, et cette question a surgi avec une version récente.