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 Applicant
o RestController
antes de adicionar, @ComponentScan()
fui capaz de retornar uma string the UI
, significando que meu RestController
estava funcionando, agora ele está sendo ignorado. Estou feio Whitelabel Error Page
agora.
--------------------- 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 ApplicantImpl
classe que é @Autowires
meu repositório TApplicantRepository
nela.
fonte
Respostas:
Pode ser porque o projeto foi dividido em módulos diferentes.
fonte
@EntityScan
e@EnableJpaRepositories
com os nomes de pacote certos funcionou para mim.Há uma chance ...
Você pode estar faltando
@Service
,@Repository
anotação em suas respectivas classes de implementação.fonte
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
@SpringBootApplication
serão verificados.suponha que sua
main
classe "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.
"fonte
build.gradle
. Essesbuild.gradle
nomes de módulo são adicionados aodependencies
do módulo com o método principal. Portanto, quando você viu@ComponentScan("module-service")
, pensei que funcionaria. No entanto, dentromodule-service
tem 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?@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
@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.Basicamente, isso acontece quando você tem seu aplicativo de classe em "outro pacote". Por exemplo:
Eu resolvo o problema com isso no Application.class
Outra forma menos elegante é: colocar todas as classes de configuração no mesmo pacote.
fonte
@ComponentScan
no cenário acima. Porque yourApplication.class
(que tem a@SpringBootApplication
anotação) é colocado emcom.server
que é a raiz de amboscom.server.config
e tambémcom.server.repository
.@EnableMongoRepositories
?No meu caso, cometi um erro terrível. Eu coloquei
@Service
na interface de serviço.Para consertar, coloquei
@Service
a implementação do arquivo de serviço e funcionou para mim.fonte
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:
import org.springframework.context.annotation.ComponentScan;
fonte
Acho que você pode simplificar anotando seu repositório com @Repository, então ele será habilitado automaticamente pelo Spring Framework.
fonte
No meu caso, essas duas opções funcionaram.
em
//@ComponentScan ({"myapp", "myapp.resources","myapp.services"})
inclui também o pacote que contém oApplication.class
na lista, ouBasta adicionar
@EnableAutoConfiguration
; ele reconhece automaticamente todos os grãos da primavera.fonte
Isso também pode acontecer se você estiver usando o Lombok e adicionar os campos
@RequiredArgsConstructor
e@NonNull
for, mas alguns de seus campos não devem ser injetados no construtor. Esta é apenas uma das possibilidades de obter o mesmo erro.No meu caso o erro me disse em qual Controlador estava o problema, depois de remover
@NonNull
o aplicativo começou bemfonte
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:
fonte
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:
Então estou tentando adicionar um mapa para armazenar algo em cache e ele se torna este:
Estrondo!
Eu removi o
@AllArgsConstructor(onConstructor = @__(@Autowired))
e adicionei@Autowired
para cada umrepository
eservice
exceto oMap<String, String>
. Funciona como antes.Espero que isso possa ser útil.
fonte
Funcionou para mim depois de adicionar a anotação abaixo no aplicativo:
@ComponentScan({"com.seic.deliveryautomation.mapper"})
Eu estava recebendo o erro abaixo:
fonte
A anotação @Configuration apenas resolverá o erro
fonte
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.
fonte
fonte
Isso pode acontecer se a classe @Service for marcada como abstrata.
fonte
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.
fonte
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
fonte
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.
fonte
No meu caso esse erro aparece porque minha importação estava errada, por exemplo, usando spring, a importação aparece automaticamente:
mas eu precisava:
fonte
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ê
fonte
Meu erro foi ter incluído:
ao invés de:
fonte
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
fonte
Adicionar a dependência Spring Boot Data JPA Starter resolveu o problema para mim.
Maven
Gradle
Ou você pode ir diretamente aqui
fonte
Se você usar,
interface
pode estenderCrudRepository<Applicant,Long>
com@Repository
anotação.fonte
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
fonte
É possível que você esteja tentando @autowired uma interface antes de implementá-la.
solução de exemplo:
fonte
Remova a configuração do tipo de anotação como @Service do método de execução de thread.
fonte
Tente configurar a estrutura do projeto conforme a seguir:
Coloque todos os pacotes de repo, serviço, no pacote filho do pacote principal:
fonte
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.
fonte