web-dev-qa-db-fra.com

UnsatisfiedDependencyException: Erreur lors de la création du bean avec le nom

Pendant plusieurs jours, j'essaie de créer une application Spring CRUD. Je suis confus .. Je ne peux pas résoudre ces erreurs.

org.springframework.beans.factory.UnsatisfiedDependencyException: Erreur lors de la création du bean avec le nom 'clientController': Dépendance non satisfaite exprimée par la méthode 'setClientService', paramètre 0; L'exception imbriquée est org.springframework.beans.factory.UnsatisfiedDependencyException: Erreur lors de la création d'un bean avec le nom 'clientService': Dépendance non satisfaite exprimée dans le champ 'clientRepository'; L'exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean qualifiant de type 'com.kopylov.repository.ClientRepository' disponible: attendu au moins 1 bean pouvant être considéré comme candidat autowire. Annotations de dépendance: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}

et ça

org.springframework.beans.factory.UnsatisfiedDependencyException: Erreur lors de la création du bean avec le nom 'clientService': Dépendance non satisfaite exprimée dans le champ 'clientRepository'; L'exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean qualifiant de type 'com.kopylov.repository.ClientRepository' disponible: attendu au moins 1 bean pouvant être considéré comme candidat autowire. Annotations de dépendance: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}

ClientController

@Controller
public class ClientController {
private ClientService clientService;

@Autowired
@Qualifier("clientService")
public void setClientService(ClientService clientService){
    this.clientService=clientService;
}
@RequestMapping(value = "registration/add", method = RequestMethod.POST)
public String addUser(@ModelAttribute Client client){
    this.clientService.addClient(client);
return "home";
}
}

ClientServiceImpl

@Service("clientService")
public class ClientServiceImpl implements ClientService{

private ClientRepository clientRepository;

@Autowired
@Qualifier("clientRepository")
public void setClientRepository(ClientRepository clientRepository){
    this.clientRepository=clientRepository;
}



@Transactional
public void addClient(Client client){
    clientRepository.saveAndFlush(client);
}
}

ClientRepository

public interface ClientRepository extends JpaRepository<Client, Integer> {

}

J'ai parcouru beaucoup de questions similaires, mais aucune réponse à celles-ci ne peut m'aider.

27
kopylov

ClientRepository doit être annoté avec la balise @Repository. Avec votre configuration actuelle, Spring n’analysera pas la classe et n’aura aucune connaissance à ce sujet. Au moment du démarrage et du câblage, la classe ClientRepository ne sera pas trouvée. 

EDIT Si l’ajout de la balise @Repository ne résout pas le problème, je pense que le problème est peut-être lié maintenant à ClientService et ClientServiceImpl.

Essayez d’annoter la ClientService (interface) avec @Service. Comme vous ne devez avoir qu'une seule implémentation pour votre service, vous n'avez pas besoin de spécifier un nom avec le paramètre facultatif @Service("clientService"). Spring le générera automatiquement en fonction du nom de l'interface.

En outre, comme Bruno l'a mentionné, le @Qualifier n'est pas nécessaire dans la ClientController car vous n'avez qu'une seule implémentation pour le service. 

ClientService.Java

@Service
public interface ClientService {

    void addClient(Client client);
}

ClientServiceImpl.Java (option 1)

@Service
public class ClientServiceImpl implements ClientService{

    private ClientRepository clientRepository;

    @Autowired
    public void setClientRepository(ClientRepository clientRepository){
        this.clientRepository=clientRepository;
    }

    @Transactional
    public void addClient(Client client){
        clientRepository.saveAndFlush(client);
    }
}

ClientServiceImpl.Java (option 2/préféré)

@Service
public class ClientServiceImpl implements ClientService{

    @Autowired
    private ClientRepository clientRepository;

    @Transactional
    public void addClient(Client client){
        clientRepository.saveAndFlush(client);
    }
}

ClientController.Java

@Controller
public class ClientController {
    private ClientService clientService;

    @Autowired
    //@Qualifier("clientService")
    public void setClientService(ClientService clientService){
        this.clientService=clientService;
    }

    @RequestMapping(value = "registration", method = RequestMethod.GET)
    public String reg(Model model){
        model.addAttribute("client", new Client());
        return "registration";
    }

    @RequestMapping(value = "registration/add", method = RequestMethod.POST)
    public String addUser(@ModelAttribute Client client){
        this.clientService.addClient(client);
    return "home";
    }
}
14
Alex Roig

Cela peut arriver parce que les pojos que vous utilisez manquent du constructeur précis dont le service a besoin. Autrement dit, essayez de générer tous les constructeurs pour le pojo ou les objets (objet de modèle) utilisés par votre serviceClient afin que le client puisse être instancié correctement. Dans votre cas, régénérez les constructeurs (avec des arguments) pour votre objet client (c'est votre objet de modèle).

1
Ricuzzo

Essayez d’ajouter @EntityScan (basePackages = "insérez le nom du paquet ici") au-dessus de votre classe principale.

1
Shubham Chopra

Considérant que l'analyse de votre paquet est correctement définie via une configuration XML ou une configuration basée sur des annotations.

Vous aurez également besoin d'un @Repository sur votre implémentation ClientRepository pour permettre à Spring de l'utiliser dans un @Autowired. Comme ce n’est pas ici, nous ne pouvons que supposer que c’est ce qui manque.

En passant, il serait préférable de mettre votre @Autowired/@Qualifier directement sur votre membre si la méthode setter est utilisée uniquement pour le @Autowired.

@Autowired
@Qualifier("clientRepository")
private ClientRepository clientRepository;

Enfin, vous n'avez pas besoin du @Qualifier, car il n'y a qu'une seule classe implémentant la définition du bean. Vous pouvez donc supprimer le @Qualifier à moins que vous n'ayez plusieurs implémentations de ClientService et ClientRepository

1
Bruno Delor

J'ai eu exactement le même problème, avec une très très longue trace de pile .

InvalidQueryException: l'espace de clés 'mykeyspace' n'existe pas

J'ai créé l'espace-clé dans Cassandra et résolu le problème.

CREATE KEYSPACE mykeyspace
  WITH REPLICATION = { 
   'class' : 'SimpleStrategy', 
   'replication_factor' : 1 
  };
0
Kristof Dombi

Je viens d'ajouter l'annotation @Repository à l'interface du référentiel et @EnableJpaRepositories ("domain.repositroy-package") à la classe principale. Cela a bien fonctionné.

0
Nesryna

Si vous utilisez Spring Boot, votre application principale devrait ressembler à ceci (juste pour faire et comprendre les choses simplement) 

package aaa.bbb.ccc;
@SpringBootApplication
@ComponentScan({ "aaa.bbb.ccc.*" })
public class Application {
.....

Assurez-vous que vous avez bien annoté @Repository et @Service.

Assurez-vous que tous vos paquets tombent sous - aaa.bbb.ccc. *

Dans la plupart des cas, cette configuration résout ce type de problèmes triviaux. Ici est un exemple complet. J'espère que ça aide.

0
Ajay Kumar

Je sais que cela semble trop tard, mais cela pourrait aider les autres à l'avenir.

Je suis confronté à la même erreur et le problème était que spring boot ne lisait pas mon paquet de services alors ajoutez:

@ComponentScan(basePackages = {"com.example.demo.Services"}) (vous devez spécifier votre propre chemin d'accès au package de services) et dans la classe demoApplication (classe ayant la fonction main) et pour l'interface de service doit être annoté @Service et la classe qui implémente l'interface de service doit être annotée avec @Component, puis auto-câblée l'interface de service.

0
ben fadhel Ichraf

Si vous décrivez un champ en tant que critère dans la définition de méthode ("findBy"), vous devez transmettre ce paramètre à la méthode, sinon vous obtiendrez une exception "Dépendance non satisfaite exprimée par le paramètre de méthode".

public interface ClientRepository extends JpaRepository<Client, Integer> {
       Client findByClientId();                ////WRONG !!!!
       Client findByClientId(int clientId);    /// CORRECT 
}

* Je suppose que votre entité client a l'attribut clientId.

0
ÖMER TAŞCI

Ajouter une annotation @Repository au référentiel Spring Data JPA

0
Sergio

Selon documentation , vous devez définir la configuration XML:

<jpa:repositories base-package="com.kopylov.repository" />
0
Dmitry Gorkovets

Je faisais face au même problème, et c’était vrai, j’ai manqué de marquer ma classe DAO avec des annotations d’entité. J'ai essayé ci-dessous et l'erreur s'est résolue.

/**
*`enter code here`
*/
@Entity <-- was missing earlier
    public class Topic {
        @Id  
        String id;
        String name;
        String desc;

    .
    .
    .
    }
0
Nitish Sharma

Consultez la structure de table de la table client. S'il y a une incompatibilité entre la structure de table dans la base de données et l'entité, vous obtiendrez cette erreur.

J'ai eu cette erreur qui venait en raison de l'inadéquation du type de données de la clé primaire entre la table de la base de données et l'entité ... 

0
Siddaraju Siddappa