2
votes

Comment réparer l'exception "Field ... requis un bean de type ... qui n'a pas pu être trouvé" Spring Boot

Je travaille avec le tutoriel Spring Boot de javabrains et tout était clair jusqu'à ce que CrudRepository soit placé dans le projet. Ci-dessous vous pouvez trouver ma classe principale:

Error starting ApplicationContext. To display the conditions report re-       run your application with 'debug' enabled.
2019-05-01 10:33:52.206 ERROR 6972 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field topicRepository in pl.springBootStarter.app.topic.TopicService required a bean of type 'pl.springBootStarter.app.topic.TopicRepository' that could not be found.

The injection point has the following annotations:
-    @org.springframework.beans.factory.annotation.Autowired(required=true)

Classe de service:

package pl.springBootStarter.app.topic;

import org.springframework.data.repository.CrudRepository;

public interface TopicRepository extends CrudRepository<Topic,String>
{

}

Et interface Repository : p>

package pl.springBootStarter.app.topic;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Service
public class TopicService
{
    @Autowired
    private TopicRepository topicRepository;

    private List<Topic> topics =  new ArrayList<>(Arrays.asList(
            new Topic("spring","spring framework", "spring framework dectription"),
            new Topic("sprin","spring framework", "spring framework dectription"),
            new Topic("spri","spring framework", "spring framework dectription")));

    public  List<Topic> getAllTopics()
    {
    //    return topics;
    List<Topic> t = new ArrayList<Topic>();
    topicRepository.findAll().forEach(t::add);
    return t;
    }

    public Topic getTopic (String id)
    {
        return   topics.stream().filter( t -> t.getId().equals(id)).findFirst().get();
    }

    public void addTopic(Topic topic) {
        topicRepository.save(topic);
    }

    public void updateTopic(Topic topic, String id)
    {
        topics.set(topics.indexOf(topics.stream().filter(t-> t.getId().equals(id)).findFirst().get()), topic);
    }

    public void deleteTopic(String id)
    {
        topics.remove(topics.stream().filter(t -> t.getId().equals(id)).findFirst().get());
    }
}

Lorsque j'exécute l'application, il y a un problème avec l'injection de TopicRepository dans le champ topicRepository dans TopicService code> classe. J'obtiens l'erreur suivante:

package pl.springBootStarter.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CourseApiDataApplication
{
    public static void main(String args[])
{
    SpringApplication.run(CourseApiDataApplication.class,args);
}
}

Quelle pourrait être la raison pour laquelle Spring ne peut pas effectuer le câblage automatique?


0 commentaires

5 Réponses :


4
votes

Assurez-vous que la classe est analysée au printemps!

(cela peut aider si c'est le problème: Problèmes d'Intellij Springboot au démarrage ).


Vous pouvez éventuellement annoter TopicRepository en tant que @Repository .

@Repository
public interface TopicRepository extends CrudRepository<Topic,String>
{
}

Voir un code de démonstration ici: https://github.com/lealceldeiro/repository-demo

p >


5 commentaires

@Elrok avez-vous un référentiel dans lequel je peux jeter un œil? Ceci est censé fonctionner. Je l'ai utilisé moi-même beaucoup de fois. Vous êtes-vous assuré que Spring détecte la classe TopicRepository et s'enregistre en tant que bean?


Dans mon projet, il n'y a que 4 classes: CourseApiDataApplication TopicRepository TopicService Topic - la classe qui contient les champs, les getters et les setters.


Je suis assez nouveau au printemps. Comment s'assurer que Spring détecte la classe TopicRepository et s'enregistre en tant que bean?


Je suis sûr que le problème dans mon application est que Spring ne trouve pas la classe TopicRepository comme un bean. Il ne sait donc pas ce qui doit être injecté dans le champ topicRepository de la classe TopicService.


@Elrok voir ceci: stackoverflow.com/ questions / 52154652 /… Je crée une démo pour vous ... donnez quelques minutes



2
votes

Spring ne peut pas injecter de bean car il n'a pas été créé.

Vous devez demander à Spring de générer l'implémentation des interfaces de référentiel déclarées en utilisant l'annotation @EnableJpaRepositories (basePackages = {"pl.springBootStarter.app"}) sur l'une de vos classes de configuration ou classe annotée avec @SpringBootApplication . Cela devrait résoudre votre problème.


3 commentaires

J'ai mis cela dans ma classe principale et j'ai maintenant une autre exception: le champ topicRepository dans pl.springBootStarter.app.topic.TopicService nécessitait un bean nommé 'entityManagerFactory' qui n'a pas pu être trouvé. Le point d'injection a les annotations suivantes: - @ org.springframework.beans.factory.annotation.Autowired (requ‌ ired = true)


semble que vous n'ayez pas configuré le contexte de persistance, pouvez-vous publier votre fichier de configuration?


La solution de @lealceldeiro a parfaitement fonctionné. J'ai dû mettre @ComponentScan ("packageName") dans mon package, où j'avais mes classes Service Repository et Controler. Dziękuję za zainteresowanie tematem.



0
votes

Pour toute personne qui a été amenée ici en recherchant sur Google le message d'erreur générique du bean, mais qui essaie en fait d'ajouter un client feint à son application Spring Boot via le L'annotation @FeignClient sur votre interface client, aucune des solutions ci-dessus ne fonctionnera pour vous.

Pour résoudre le problème, vous devez ajouter l'annotation @EnableFeignClients à votre classe Application , comme ceci:

@SpringBootApplication
// ... (other pre-existing annotations) ...
@EnableFeignClients // <------- THE IMPORTANT ONE
public class Application {


0 commentaires

1
votes

J'ai reçu un message similaire et il me manquait l'annotation @Service dans la classe Service. Erreur simple, publier au cas où cela aiderait quelqu'un d'autre.


0 commentaires

0
votes

J'ai reçu un message similaire.

la chose était que mon package principal était com.example et le package pour les autres classes était com.xyz

donc quand j'ai changé le nom du package d'une autre classe en com.example.topic

c'est-à-dire enfin Le package principal était com.example et le package de l'autre classe était com.example.topic

Une simple erreur, publier au cas où cela aiderait quelqu'un d'autre.


0 commentaires