Considere definir um bean do tipo 'pacote' em sua configuração [Spring-Boot]

108

Eu estou recebendo o seguinte erro:

***************************
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.

Nunca vi esse erro antes mas é estranho que o @Autowire não esteja funcionando. Aqui está a estrutura do projeto:

Interface do Requerente

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

Agora eu devo ser capaz de apenas Autowire Applicant e ser capaz de acessar, entretanto, neste caso, não está funcionando quando eu ligo no meu @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";
    }

}

------------------------ ATUALIZAÇÃO 1 -----------------------

Eu adicionei

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

}

e o erro foi embora, mas nada aconteceu. No entanto, quando comentei tudo sobre Applicanto RestControllerantes de adicionar, @ComponentScan()fui capaz de retornar uma string the UI, significando que meu RestControllerestava funcionando, agora ele está sendo ignorado. Estou feio Whitelabel Error Pageagora.

--------------------- ATUALIZAÇÃO 2 --------------------------- ---

Eu adicionei o pacote básico do feijão do qual ele estava reclamando. Erro lê:

***************************
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.

Eu adicionei @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);
    }

}

---------------------------- Atualização 3 -------------------- -

adicionando:

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

ainda está reclamando da minha ApplicantImplclasse que é @Autowiresmeu repositório TApplicantRepositorynela.

Mike3355
fonte
Onde está o arquivo de contexto do seu aplicativo? Se você não tiver um, deve considerar dar ao Spring algumas dicas com anotações como @ComponentScan para disponibilizar todos os beans.
Mario Santini
@MarioSantini consulte a atualização 1
Mike3355
Presumo que após cada atualização houve mudanças nos erros? Se possível, poste a estrutura do seu projeto e os logs de erros / stacktrace em cada caso. É melhor saber "Por que" esses erros ocorreram, ao invés de um "algo" que fez o erro desaparecer. Será útil para outras pessoas que também se depararem com um problema semelhante.
Ameen.M

Respostas:

201

Pode ser porque o projeto foi dividido em módulos diferentes.

@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {
Mike3355
fonte
5
Legal. Meu projeto é dividido por vários módulos. O ComponentScan resolveu meu problema!
kholofelo Maloma
A anotação ComponentScan resolve meu problema, mas @EnableAutoConfiguration não
jpl
Na verdade, EnableAutoConfiguration define implicitamente um “pacote de pesquisa” básico para certos itens e o uso de um pacote raiz também permite que a anotação ComponentScan seja usada sem a necessidade de especificar um atributo basePackage. E a anotação @SpringBootApplication pode ser usada se sua classe principal estiver no pacote raiz
jpl
1
Esta solução me ajudou com este erro na versão 2.0.4
manu muraleedharan
2
Sim, é devido ao fato de que o projeto foi dividido em diferentes módulos. @EntityScane @EnableJpaRepositoriescom os nomes de pacote certos funcionou para mim.
Adi Sivasankaran,
51

Há uma chance ...
Você pode estar faltando @Service, @Repositoryanotação em suas respectivas classes de implementação.

CodeWorld
fonte
2
Esta deve ser a resposta aceita, simples e direta. Obrigado.
nightfury
1
Funcionou para mim. Obrigado.
Okafor T Kosiso
1
Obrigado, estava faltando a anotação do
@Repository
1
Sim, esta deve ser a resposta. As respostas acima estão simplesmente assumindo que a varredura falhou, o que é errado.
Sumit Badsara
48

Parece que sua turma de Candidato não foi digitalizada. Por padrão, todos os pacotes que começam com o root como a classe onde você colocou @SpringBootApplicationserão verificados.

suponha que sua mainclasse "WebServiceApplication" esteja em " com.service.something", então todos os componentes que se enquadram em " com.service.something" são verificados e " com.service.applicant" não serão verificados.

Você pode reestruturar seus pacotes de forma que "WebServiceApplication" caia em um pacote raiz e todos os outros componentes se tornem parte desse pacote raiz. Ou você pode incluir@SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"}) etc. de forma que "TODOS" os componentes sejam digitalizados e inicializados no contêiner da mola.

Atualização com base em comentário

Se você tiver vários módulos gerenciados pelo maven / gradle, tudo o que o Spring precisa é o pacote a ser digitalizado. Você diz ao spring para escanear "com.module1" e você tem outro módulo que tem seu nome de pacote raiz como "com.module2", esses componentes não serão escaneados. Você pode até dizer ao spring para escanear "com", que irá então escanear todos os componentes em " com.module1." e " com.module2."

Ameen.M
fonte
Meu projeto é estrutura em módulos diferentes. Por exemplo, os serviços terão seu próprio módulo e build.gradle. Esses build.gradlenomes de módulo são adicionados ao dependenciesdo módulo com o método principal. Portanto, quando você viu @ComponentScan("module-service"), pensei que funcionaria. No entanto, dentro module-servicetem um pacote. Então, minha pergunta como seria? Devo apenas nomear o nome do pacote ou o nome do módulo ou de alguma forma ambos?
Mike3355
Não importa se os pacotes se enquadram em módulos diferentes. Os pacotes nos quais os componentes devem ser escaneados devem ser especificados para a primavera. Você pode fornecer todos os nomes de pacote "raiz" de todos os seus módulos no atributo "scanBasePackages". E todos os "pacotes" que precisam ser mencionados, não os módulos.
Ameen.M
Fiz o que vc falou e, o erro foi embora mas só para reclamar de mais um pacote. Naturalmente, adicionei-o à lista, mas ele não vai embora. Eu implementei assim:@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
Mike3355
Acabei de fazer @SpringBootApplication(scanBasePackages= "com")e ele está reclamando do repositório JPA. Muito obrigado. Eu não sabia que o spring examinaria todos os pacotes que começam com "com" se você fizesse o acima.
Mike3355
23

Basicamente, isso acontece quando você tem seu aplicativo de classe em "outro pacote". Por exemplo:

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

Eu resolvo o problema com isso no Application.class

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

Outra forma menos elegante é: colocar todas as classes de configuração no mesmo pacote.

Carlos marcano
fonte
2
De fato, você não precisa especificar @ComponentScanno cenário acima. Porque your Application.class(que tem a @SpringBootApplicationanotação) é colocado em com.serverque é a raiz de ambos com.server.confige também com.server.repository.
Ameen.M
@ Ameen.MEsta é exatamente a minha pergunta, por que ainda não foi possível resolver e por que exige uma varredura explícita para o uso dos repositórios mongo @EnableMongoRepositories?
Karthikeyan
10

No meu caso, cometi um erro terrível. Eu coloquei @Servicena interface de serviço.

Para consertar, coloquei @Servicea implementação do arquivo de serviço e funcionou para mim.

Mohammad Falahi
fonte
O mesmo para mim. Obrigado
Manta
7

Se um bean estiver no mesmo pacote em que está @Autowired, ele nunca causará tal problema. No entanto, os beans não são acessíveis a partir de pacotes diferentes por padrão. Para corrigir esse problema, siga estas etapas:

  1. Importe o seguinte em sua classe principal:
    import org.springframework.context.annotation.ComponentScan;
  2. adicione anotações sobre sua classe principal:
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringExampleApplication.class, args);
    }
}
ASHWANI PANDEY
fonte
5

Acho que você pode simplificar anotando seu repositório com @Repository, então ele será habilitado automaticamente pelo Spring Framework.

Tushar Saha Chowdhury
fonte
4

No meu caso, essas duas opções funcionaram.

  1. em //@ComponentScan ({"myapp", "myapp.resources","myapp.services"}) inclui também o pacote que contém o Application.classna lista, ou

  2. Basta adicionar @EnableAutoConfiguration; ele reconhece automaticamente todos os grãos da primavera.

Sriharsha grv
fonte
3

Isso também pode acontecer se você estiver usando o Lombok e adicionar os campos @RequiredArgsConstructore @NonNullfor, mas alguns de seus campos não devem ser injetados no construtor. Esta é apenas uma das possibilidades de obter o mesmo erro.

o parâmetro 0 requer um bean do tipo MissingBeanName que não pode ser encontrado

No meu caso o erro me disse em qual Controlador estava o problema, depois de remover @NonNullo aplicativo começou bem

Dawid Gorczyca
fonte
3

Eu enfrentei um problema familiar em meu projeto multimódulo Maven com Spring Boot 2. O problema estava relacionado à nomeação de meus pacotes em submódulos Maven.

@SpringBootApplication incapsula vários componentes como - @ComponentScan, @EnableAutoConfiguration, jpa-repositories, json-serialization e assim por diante. E ele coloca @ComponentScan no pacote com. *******. Space. Esta parte dos pacotes com. *******. Space deve ser comum para todos os módulos.

Para consertar:

  1. Você deve renomear todos os pacotes de módulo. Outras palavras que você tinha que ter em todos os pacotes em todos os módulos Maven - a mesma parte pai. Por exemplo - com. *******. Space
  2. Além disso, você deve mover seu ponto de entrada para este pacote - com. *******. Space
alexis_druzik
fonte
2

Procurei uma resposta online, mas parece que não há uma solução adequada para o meu caso: No início, tudo funciona bem da seguinte maneira:

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

Então estou tentando adicionar um mapa para armazenar algo em cache e ele se torna este:

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

Estrondo!

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.

Eu removi o @AllArgsConstructor(onConstructor = @__(@Autowired))e adicionei @Autowiredpara cada um repositorye serviceexceto o Map<String, String>. Funciona como antes.

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

Espero que isso possa ser útil.

Hearen
fonte
2

Funcionou para mim depois de adicionar a anotação abaixo no aplicativo:

@ComponentScan({"com.seic.deliveryautomation.mapper"})

Eu estava recebendo o erro abaixo:

"parâmetro 1 do construtor requer um bean do mapeador de tipo que não foi encontrado:

Amo Kumar
fonte
2

A anotação @Configuration apenas resolverá o erro

oludamilare olukotun
fonte
2

Você também obterá esse erro se definir acidentalmente o mesmo bean em duas classes diferentes. Isso aconteceu comigo. A mensagem de erro foi enganosa. Quando removi o bean extra, o problema foi resolvido.

Ross Mills
fonte
1
@SpringBootApplication
@MapperScan("com.developer.project.mapper")

public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
desenvolvedor07
fonte
1

Isso pode acontecer se a classe @Service for marcada como abstrata.

Ariel
fonte
1

Se sua dependência de classe é gerenciada pelo Spring, então esse problema pode ocorrer se esquecermos de adicionar o construtor arg default / vazio dentro de nossa classe POJO.

Arif Khan
fonte
1

Pode ajudar alguém. Tive o mesmo problema, mesma mensagem de erro, tudo mesmo. Tentei soluções com outras respostas, mas não adiantou até que percebi que o bean que estou usando tem o mesmo nome daquele que realmente foi autowired. Aconteceu no meio do refatorador, então tive que renomear a classe, o que resultou positivamente. Felicidades

Staxx
fonte
1

Eu enfrentei o mesmo problema. O repositório Mongo DB foi identificado pelo Spring boot, mas não estava criando o Bean para uma interface de repositório que estendia o repositório mongo.

O problema no meu caso era a especificação de versão incorreta em maven pom para "spring + mango". Eu mudei a id de grupo do artefato e tudo funcionou como mágica. nenhuma anotação necessária como a bota de primavera cuidou de tudo.

Durante a resolução do meu problema, eu estava em toda a web procurando por soluções e percebi que esse problema está na verdade relacionado à configuração do projeto. Qualquer pessoa que enfrente esse problema deve primeiro verificar a configuração do projeto e habilitar a depuração da primavera para obter mais detalhes sobre a falha e prestar atenção a onde exatamente no processo, a criação falhou.

user13650952
fonte
0

No meu caso esse erro aparece porque minha importação estava errada, por exemplo, usando spring, a importação aparece automaticamente:

import org.jvnet.hk2.annotations.Service;

mas eu precisava:

import org.springframework.stereotype.Service;
Washington da Silva
fonte
0

Tive um caso em que preciso injetar RestTemplate em uma classe de serviço. No entanto, o RestTemplate não pode ser selecionado pela classe de serviço. O que fiz foi criar uma classe de invólucro no mesmo pacote do aplicativo principal e marcar o invólucro como Componente e autowire esse componente na classe de serviço. Problema resolvido. espero que também funcione para você

user11976602
fonte
0

Meu erro foi ter incluído:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

ao invés de:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
user1441323
fonte
0

Acho que está faltando a anotação @Bean em seu RequestController

Adicione o Bean em seu arquivo, isso resolveu meu problema.
Eu peguei essa solução enquanto estava aprendendo Spring Boot do tutorialspoint

private Applicant applicant;

@Bean 
public Applicant applicant() { 
    return new Applicant(); 
}
user3709901
fonte
0

Adicionar a dependência Spring Boot Data JPA Starter resolveu o problema para mim.

Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

Gradle

compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.2.6.RELEASE'

Ou você pode ir diretamente aqui

Johny Thomas Kariath
fonte
Na verdade, isso não se aplica neste caso. Ele solicita os detalhes da conexão ao banco de dados (Falha ao configurar uma fonte de dados: o atributo 'url' não foi especificado e nenhuma fonte de dados incorporada pôde ser configurada.). Em uma situação em que desejo testar manualmente sem interagir com o banco de dados, isso não funcionará.
Thomas Okonkwo
0

Se você usar, interfacepode estender CrudRepository<Applicant,Long>com @Repositoryanotação.

zawhtut
fonte
0

O problema também pode aparecer quando você usa por exemplo @EnableMongoRepositories(YOUR_MONGO_REPOSITORIES_PACKAGE)e, posteriormente, renomeia o nome do pacote ou o move para outro lugar.

Muitas vezes o enfrentei em um projeto maven multi-módulo e bota de mola

redoff
fonte
0

É possível que você esteja tentando @autowired uma interface antes de implementá-la.

solução de exemplo:

    **HomeController.java**
    class HomeController{

      @Autowired
      UserService userService;
    .....
    }
----------------------------------------------------------------------
    **UserService.java** 
    public interface UserService {
        User findByUsername(String username);
    .....
    }
-----------------------------------------------------------------------
     **UserServiceImpl.java**
     @Service
     public class UserServiceImpl implements UserService{

         public User findByUsername(String username) {
           return userDao.findByUsername(username);
         }
        ....
      }

<i>This is not italic</i>, and [this is not a link](https://example.com)
biddut
fonte
0

Remova a configuração do tipo de anotação como @Service do método de execução de thread.

@Service, @Component
Sandun Susantha
fonte
0

Tente configurar a estrutura do projeto conforme a seguir:

Coloque todos os pacotes de repo, serviço, no pacote filho do pacote principal:

package com.leisure.moviemax;  //Parent package
        
@SpringBootApplication
@PropertySource(value={"classpath:conf.properties"})
    
public class MoviemaxApplication implements CommandLineRunner {
        
package com.leisure.moviemax.repo; //child package

@Repository
public interface UsrRepository extends JpaRepository<UserEntity,String> {
Barani r
fonte
0

lembrete de que o spring não faz a varredura do mundo, ele usa a varredura direcionada, o que significa tudo sob o pacote onde o aplicativo springboot está armazenado. portanto, este erro "Considere definir um bean do tipo 'pacote' em sua configuração [Spring-Boot]" pode aparecer porque você tem interfaces de serviços em um pacote springbootapplication diferente.

pipoca
fonte