111 votes

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

Pendant plusieurs jours, je suis en train de créer le Printemps CRUD application. Je suis confus. Je ne peux pas résoudre cette erreur.

org.springframework.les haricots.usine.UnsatisfiedDependencyException: Erreur lors de la création de haricots avec le nom "clientController': Insatisfait de la dépendance exprimée par le biais de la méthode 'setClientService paramètre 0; nested exception est org.springframework.les haricots.usine.UnsatisfiedDependencyException: Erreur lors de la création de haricots avec le nom "clientService': Insatisfait de la dépendance exprimée à travers le champ 'clientRepository'; nested exception est org.springframework.les haricots.usine.NoSuchBeanDefinitionException: Pas de qualification bean de type " com.kopylov.référentiel.ClientRepository " disponible: attendre au moins 1 fève qui se qualifie comme autowire candidat. La dépendance des annotations: {@org.springframework.les haricots.usine.annotation.Autocâblés(required=true)}

et ce

org.springframework.les haricots.usine.UnsatisfiedDependencyException: Erreur lors de la création de haricots avec le nom "clientService': Insatisfait de la dépendance exprimée à travers le champ 'clientRepository'; nested exception est org.springframework.les haricots.usine.NoSuchBeanDefinitionException: Pas de qualification bean de type " com.kopylov.référentiel.ClientRepository " disponible: attendre au moins 1 fève qui se qualifie comme autowire candidat. La dépendance des annotations: {@org.springframework.les haricots.usine.annotation.Autocâblés(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 regardé à travers beaucoup de questions similaires, mais pas de réponse unique à eux, ne peuvent pas m'aider.

56voto

Alex Roig Points 1089

Le ClientRepository doivent être annotées avec @Repository balise. Avec votre configuration actuelle, le Printemps n'analyse pas la classe et ont des connaissances à ce sujet. Au moment de l'amorçage et le câblage ne trouverez pas le ClientRepository classe.

MODIFIER Si l'ajout de l' @Repository balise n'aide pas, alors je pense que le problème est peut-être maintenant avec l' ClientService et ClientServiceImpl.

Essayez d'annoter l' ClientService (interface) avec @Service. Comme vous ne devrait avoir qu'une seule application pour votre service, vous n'avez pas besoin de spécifier un nom avec le paramètre optionnel @Service("clientService"). Le printemps sera de générer automatiquement, sur la base de l'interface' nom.

Aussi, comme Bruno l'a mentionné, l' @Qualifier n'est pas nécessaire en ClientController que vous n'avez qu'une seule mise en œuvre 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/de préférence)

@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";
    }
}

5voto

Shubham Chopra Points 412

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

4voto

Ricuzzo Points 16

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 modèle) que votre serviceClient utilise, afin que le client puisse être instancié correctement. Dans votre cas, régénérez les constructeurs (avec des arguments) pour votre objet client (taht est votre objet modèle).

1voto

Sergio Points 170

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

0voto

Bruno Delor Points 160

Considérant que votre paquet de balayage est réglée correctement, soit via un fichier XML de configuration ou de l'annotation en fonction de la configuration.

Vous aurez besoin d'un @Repository sur votre ClientRepository mise en œuvre pour permettre le Printemps de l'utiliser dans un @Autowired. Puisqu'il n'est pas ici, nous ne pouvons que supposer que ce qui est manquant.

Comme une note de côté, il serait plus propre de mettre votre @Autowired/@Qualifier directement sur votre espace membre, si le setter méthode est utilisée uniquement pour l' @Autowired.

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

Enfin, vous n'avez pas besoin de l' @Qualifier est il y a une seule classe de la mise en œuvre de la fève de définition de sorte que si vous avez plusieurs de la mise en œuvre de l' ClientService et ClientRepository vous pouvez supprimer l' @Qualifier

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X