Pensez à définir un bean de type 'package' dans votre configuration [Spring-Boot]

j'obtiens l'erreur suivante:

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

Description:

Parameter 0 of method setApplicant in webService.controller.RequestController required a bean of type 'com.service.applicant.Applicant' that could not be found.


Action:

Consider defining a bean of type 'com.service.applicant.Applicant' in your configuration.

Je n'ai jamais vu cette erreur avant mais c'est étrange que @Autowire ne fonctionne pas. Voici la structure du projet:

Demandeur "D'Interface 1519200920"

public interface Applicant {

    TApplicant findBySSN(String ssn) throws ServletException;

    void deleteByssn(String ssn) throws ServletException;

    void createApplicant(TApplicant tApplicant) throws ServletException;

    void updateApplicant(TApplicant tApplicant) throws ServletException;

    List<TApplicant> getAllApplicants() throws ServletException;
}

ApplicantImpl

@Service
@Transactional
public class ApplicantImpl implements Applicant {

private static Log log = LogFactory.getLog(ApplicantImpl.class);

    private TApplicantRepository applicantRepo;

@Override
    public List<TApplicant> getAllApplicants() throws ServletException {

        List<TApplicant> applicantList = applicantRepo.findAll();

        return applicantList;
    }
}

Maintenant, je devrais être en mesure de simplement Autowire Candidat et être en mesure d'accéder, dans ce cas, toutefois, il ne fonctionne pas quand je l'appelle dans mon @RestController:

@RestController
public class RequestController extends LoggingAware {

    private Applicant applicant;

    @Autowired
    public void setApplicant(Applicant applicant){
        this.applicant = applicant;
    }

    @RequestMapping(value="/", method = RequestMethod.GET)
    public String helloWorld() {

        try {
            List<TApplicant> applicantList = applicant.getAllApplicants();

            for (TApplicant tApplicant : applicantList){
                System.out.println("Name: "+tApplicant.getIndivName()+" SSN "+tApplicant.getIndSsn());
            }

            return "home";
        }
        catch (ServletException e) {
            e.printStackTrace();
        }

        return "error";
    }

}

------------------------mise à JOUR 1-----------------------

j'ai ajouté

@SpringBootApplication
@ComponentScan("module-service")
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

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

}

et l'erreur a disparu, mais rien ne s'est produit. Cependant quand j'ai commenté tout ce qui concerne Applicant dans le RestController avant d'ajouter @ComponentScan() j'ai pu retourner une chaîne de caractères le UI , ce qui signifie que mon RestController fonctionnait, maintenant il est sauté. Je laid Whitelabel Error Page maintenant.

---------------------mise à JOUR 2------------------------------

j'ai ajouté le paquet de base de la fève dont il se plaignait. L'erreur se lit comme suit:

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

Description:

Parameter 0 of method setApplicantRepo in com.service.applicant.ApplicantImpl required a bean of type 'com.delivery.service.request.repository.TApplicantRepository' that could not be found.


Action:

Consider defining a bean of type 'com.delivery.request.request.repository.TApplicantRepository' in your configuration.

j'ai ajouté @ComponentScan

@SpringBootApplication
@ComponentScan({"com.delivery.service","com.delivery.request"})
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

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

}

----------------------------mise à Jour 3----------------------

ajoutant:

@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {

se plaint toujours de mon ApplicantImpl classe @Autowires mon repo TApplicantRepository .

41
demandé sur Sam 2016-11-02 18:42:57

10 réponses

peut-être parce que le projet a été divisé en différents modules.

@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {
87
répondu Drew1208 2018-02-20 12:11:28

votre classe de demandeur N'est pas scanné il semble. Par défaut, tous les paquets commençant par la racine comme la classe où vous avez mis @SpringBootApplication seront scannés.

supposez que votre main classe "WebServiceApplication" est dans com.service.something ", puis tous les composants qui tombent sous " com.service.something "est scanné, et" com.service.applicant " ne sera pas scanné.

vous pouvez soit restructurer vos paquets de telle sorte que" WebServiceApplication " tombe sous un le paquet racine et tous les autres composants font partie de ce paquet racine. Ou vous pouvez inclure @SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"}) etc tel que "tous" les composants sont balayés et initialisés dans le conteneur de ressort.

mise à jour basée sur le commentaire

si vous avez plusieurs modules qui sont gérés par maven/gradle, tous les besoins de ressort est le paquet à scanner. Vous dites à spring de scanner " com.module1" et vous avez un autre module qui a son paquet racine un nom comme "com.module2", ces composants ne seront pas analysés. Vous pouvez même dire à spring de numériser " com " qui numérisera alors tous les composants dans " com.module1. " et " com.module2.

26
répondu Ameen.M 2016-11-02 18:00:38

il y a une chance...

Vous pourriez manquer @Service , @Repository annotation sur vos classes d'implémentation respectives.

15
répondu CodeWorld 2018-05-17 12:20:14

fondamentalement, cela se produit lorsque vous avez votre demande de classe dans"un autre paquet". Par exemple:

com.server
 - Applicacion.class (<--this class have @ComponentScan)
com.server.config
 - MongoConfig.class 
com.server.repository
 - UserRepository

Je résous le problème avec cela dans l'Application.classe

@SpringBootApplication
@ComponentScan ({"com.server", "com.server.config"})
@EnableMongoRepositories ("com.server.repository") // this fix the problem

une autre façon moins élégante est de: mettre toutes les classes de configuration dans le même paquet.

10
répondu Carlos Marcano 2017-04-09 03:27:14

je pense que vous pouvez le simplifier en annotant votre dépôt avec @Repository, puis il sera activé automatiquement par Spring Framework.

3
répondu Tushar Saha Chowdhury 2017-06-02 06:51:24

j'ai cherché une réponse en ligne mais il semble qu'il n'y ait pas de solution adéquate à mon cas: Au tout début, tout fonctionne comme suit:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
}

alors j'essaie d'ajouter une carte pour mettre en cache quelque chose et elle devient ceci:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
    Map<String, String> testMap;
}

Boom!

Description:

Parameter 4 of constructor in *.GroupService required a bean of type 'java.lang.String' that could not be found.


Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

j'ai supprimé le @AllArgsConstructor(onConstructor = @__(@Autowired)) et ajouter @Autowired pour chaque repository et service sauf le Map<String, String> . Il fonctionne exactement comme avant.

@Slf4j
@Service
public class SecurityGroupService {
    @Autowired
    private Repository repository;
    @Autowired
    private Service service;
    Map<String, String> testMap;
}

espère que cela pourrait être utile.

1
répondu Hearen 2018-03-27 08:50:00

cela peut aussi arriver si vous utilisez Lombok et que vous ajoutez les @RequiredArgsConstructor et @NonNull pour les champs mais certains de vos champs ne doivent pas être injectés dans le constructeur. Ce n'est qu'une des possibilités pour obtenir la même erreur.

paramètre 0 nécessitait un haricot de type MissingBeanName qui ne pouvait pas être trouvé

dans mon cas, l'erreur m'a dit dans quel contrôleur se trouvait le problème, après avoir enlevé @NonNull le démarrage de l'application d'amende

1
répondu Dawid Gorczyca 2018-05-17 12:21:06
@SpringBootApplication
@MapperScan("com.developer.project.mapper")

public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
0
répondu developer07 2017-04-28 14:07:53

cela peut se produire si la classe @Service est marquée abstract.

0
répondu Ariel 2018-06-11 01:34:06

si vous utilisez Feign et faites face au problème, il peut être causé par manque de dépendance. Vous pouvez ajouter spring-cloud-starter-feign dépendance dans pom. Par la dépendance, il peut trouver des haricots liés à Feign .

-1
répondu Frank.Chang 2018-10-11 11:16:08