intellij dizendo incorretamente nenhum bean do tipo encontrado para o repositório com conexão automática

138

Eu criei um teste de unidade simples, mas o IntelliJ está destacando incorretamente o vermelho. marcando-o como um erro

Sem feijão?

insira a descrição da imagem aqui

Como você pode ver abaixo, passa no teste? Portanto, deve ser conectado automaticamente?

insira a descrição da imagem aqui

Robbo_UK
fonte
3
O IntelliJ às vezes fornece erros falsos positivos no fio automático. Por exemplo, nos aplicativos Spring Boot, nos quais grande parte da configuração está oculta por trás do EnableAutoConfiguration. Há uma questão em aberto para isso. Outra causa pode estar configurada incorretamente no Spring. O que eu costumo fazer nestas situações é reduzir o grau de controle de modo que é menos intrusivos ...
Bohuslav Burghardt

Respostas:

177

Eu tive esse mesmo problema ao criar um aplicativo Spring Boot usando sua @SpringBootApplicationanotação. Esta anotação representa @Configuration, @EnableAutoConfiguratione @ComponentScande acordo com a referência de mola .

Como esperado, a nova anotação funcionou corretamente e meu aplicativo foi executado sem problemas, mas a Intellij continuou reclamando de @Autowiredependências não preenchidas . Assim que voltei a usar @Configuration, @EnableAutoConfiguratione @ComponentScanseparadamente, os erros cessaram. Parece que o Intellij 14.0.3 (e provavelmente também versões anteriores) ainda não está configurado para reconhecer a @SpringBootApplicationanotação.

Por enquanto, se os erros o perturbarem tanto, volte para as três anotações separadas. Caso contrário, ignore o Intellij ... sua resolução de dependência está configurada corretamente, pois seu teste passa.

Sempre se lembre...

O homem é sempre maior que a máquina.

Abimbola Esuruoso
fonte
1
O problema foi corrigido agora com as versões mais recentes do Intellij (verificado em 2017.1) #
Sourabh
45
Ainda estou conseguindo com 2017.2, e é a licença paga pela última versão.
Thomas Carlisle
1
Estou obtendo isso com a classe externa 2017.2 e SprintBootTest e a classe interna estática SpringBootApplication de acordo com o exemplo de teste do Spring Cloud Stream: docs.spring.io/spring-cloud-stream/docs/current/reference/html/…
danebez
4
Para versões mais recentes do IntelliJ (por exemplo, 2017), é necessário ativar o plug-in Spring Data e não precisar das soluções alternativas acima. Há outra resposta abaixo que mostra como fazer isso.
Norbert
4
Com o IntelliJ 2018.2, usando o Spring Boot 2.0.5 e @SpringBootApplicationeu estava recebendo esse erro. Segui o conselho do @ Jaõs Matos usando o scanBasePackagesparâmetro @SpringBootApplicatione especifiquei os pacotes / namespaces que devem ser verificados.
Dave Goodchild 28/10
53

Adicione anotação Spring @Repositorysobre a classe do repositório.

Eu sei que deve funcionar sem esta anotação. Mas se você adicionar isso, o IntelliJ não mostrará erro.

@Repository
public interface YourRepository ...
...

Se você usar o Spring Data com extensão de Repositoryclasse, serão paginações de conflito. Em seguida, você deve indicar as páginas de explicação.

import org.springframework.data.repository.Repository;
...

@org.springframework.stereotype.Repository
public interface YourRepository extends Repository<YourClass, Long> {
    ...
}

E a seguir, você pode conectar automaticamente seu repositório sem erros.

@Autowired
YourRepository yourRepository;

Provavelmente não é uma boa solução (acho que você está tentando registrar o repositório duas vezes). Mas trabalhe para mim e não mostre erros.

Talvez a nova versão do IntelliJ possa ser corrigida: https://youtrack.jetbrains.com/issue/IDEA-137023

mkczyk
fonte
3
De acordo com esta youtrack.jetbrains.com/issue/IDEA-148113 que seja corrigido na versão de 16 ... (prende a respiração)
ismoore999
@ Componente também parece funcionar. Looks como um só precisa forçar a interface / classe a ser digitalizado
Brett
Você não precisa mais adicionar @Repository. Apenas no plugin Spring Data.
Shin Kim
3
Três anos mais tarde e ele está quebrado novamente
garyM
Eu usei / @ Mapper para minha interface de mapeador (mybatis). A IDEA lança este aviso. Alterei para / @ Repository o aviso foi apagado.
bzuo 10/07
32

Minha versão do IntelliJ IDEA Ultimate (2016.3.4 Build 163) parece suportar isso. O truque é que você precisa ter ativado o plug-in Spring Data.

insira a descrição da imagem aqui

Natix
fonte
Isso também corrigiu o problema para mim - parece que esse pode ser o problema real para qualquer pessoa que tenha seu código configurado corretamente!
Matsu P.
5
Não funciona em 2017.2.7. O plug-in está ativado, mas o aviso ainda está presente.
brainfrozen
Trabalhou para mim no iJ Ultimate 2018.2.5.
JL_SO 10/11
23

Às vezes, você precisa indicar onde o @ComponentScan deve procurar componentes. Você pode fazer isso passando os pacotes como parâmetro desta anotação, por exemplo:

@ComponentScan(basePackages={"path.to.my.components","path.to.my.othercomponents"})

No entanto, como já mencionado, a anotação @SpringBootApplication substitui @ComponentScan, portanto, nesses casos, você deve fazer o mesmo:

@SpringBootApplication(scanBasePackages={"path.to.my.components","path.to.my.othercomponents"})

Pelo menos no meu caso, Intellij parou de reclamar.

João Matos
fonte
2
Esta é definitivamente a solução melhor e mais limpa e pode confirmar que isso removeu o aviso. Obrigado!
Dave Goodchild 28/10
2
No meu caso, eu tinha @SpringBootApplication(scanBasePackages={"com.a.b, com.a.c"}) e, embora o aplicativo funcionasse bem, a intellij não gostou. Mudando para @SpringBootApplication(scanBasePackages={"com.a.b", "com.a.c"})fixo para mim!
GriffoGoes
1
Essa é de longe a melhor solução, pois é portátil entre IDEs e comunica claramente a intenção do desenvolvedor.
MusikPolice 18/03/19
Estou usando o boot 2019.2.1 final 2.2.1 e o java 11.0.4. O problema ainda existe nos arquivos de teste de unidade.
garyM
1
o que o @GriffoGoes sugeriu resolveu meu problema, já que eu estava usando uma estrutura de vários módulos, essa foi minha melhor solução
Juan Monsalve
20

Eu sempre resolvo esse problema fazendo o seguinte. Configurações> Inspeções> Spring Core> Código do que você muda de erro para avisar a opção de gravidade

insira a descrição da imagem aqui

cristianchiess
fonte
2
Fui com esta solução até que uma correção é feita sobre Primavera: youtrack.jetbrains.com/issue/IDEA-182912
Garry Polley
15

Estou usando o spring-boot 2.0 e o intellij 2018.1.1 ultimate edition e enfrentei o mesmo problema.

Resolvi colocando @EnableAutoConfiguration na classe principal do aplicativo

@SpringBootApplication
@EnableAutoConfiguration
class App{
/**/
}
Kareem
fonte
13
Isso também "funciona" para mim, mas, em seguida, intellij reclama: Redundant declaration: @SpringBootApplication already applies @EnableAutoConfiguration ¯ \ _ (ツ) _ / ¯
Michael
6

Verifique se você perdeu a anotação @Service na sua classe de serviço, esse foi o meu caso.

yankae
fonte
5

Colocar @Componentou @configurationno seu arquivo de configuração de bean parece funcionar, ou seja, algo como:

@Configuration
public class MyApplicationContext {
    @Bean
    public DirectoryScanner scanner() {
        return new WatchServiceDirectoryScanner("/tmp/myDir");
    }
}

@Component
public class MyApplicationContext {
    @Bean
    public DirectoryScanner scanner() {
        return new WatchServiceDirectoryScanner("/tmp/myDir");
    }
}
wired00
fonte
4

Se você não quiser fazer alterações no seu código, apenas para deixar seu IDE feliz. Eu o resolvi adicionando todos os componentes à faceta Spring.

  1. Crie um grupo com o nome "Serviço, processadores e roteadores" ou qualquer nome que desejar;
  2. Remova e recrie "Spring Application Context" use o grupo que você criou anteriormente como pai.

insira a descrição da imagem aqui

Xiao Peng - ZenUML.com
fonte
4

Enquanto seus testes estiverem passando, você é bom, pressionando alt + entero cursor sobre o erro e dentro do submenu do primeiro item, você encontrará, Disable Inspectionselecione

imal hasaranga perera
fonte
Obrigado. A propósito, existe uma maneira de ver todas as alterações feitas que não são padrão em uma exibição nas Configurações do IntelliJ (para que você saiba o que mudou)?
precisa saber é o seguinte
3

Eu tive um problema semelhante no aplicativo Spring Boot. O aplicativo utiliza Feign (solicitações de sintetização do cliente HTTP de interfaces anotadas). Tendo SomeClientanotado a interface @FeignClient, Feign gera a classe proxy de tempo de execução implementando essa interface. Quando algum componente Spring tenta autopreencher o bean do tipo SomeClient, o Idea não reclama nenhum bean do tipo SomeClientencontrado, pois não existe realmente nenhuma classe real no projeto e o Idea não é ensinado a entender a @FeignClientanotação de nenhuma maneira.

Solução: anote a interface SomeClientcom @Component. (No nosso caso, não usamos @FeignClientanotação SomeClientdiretamente, antes usamos metanotação @OurProjectFeignClientanotada @FeignCliente a adição de @Componentanotação também funciona.)

Tomáš Záluský
fonte
Sim, adicionar @Componentà interface resolve o problema. Mas acho que essa não é a maneira correta ... Na minha opinião, isso é um bug no IntelliJ IDEA ou, para não ser tão difícil, o IntelliJ IDEA não está pronto para as versões mais recentes do Feign. Ele funciona sem @Componentversões falsas (onde @FeignClientestava a anotação em org.springframework.cloud.netflix.feignvez de org.springframework.cloud.openfeign- talvez essa seja a causa do problema?). Você encontrou mais detalhes (talvez um ticket de bug) para isso?
Josef Reichardt
Não, não tenho, embora meu caso (que não funcionou sem @Component) seja @FeignClientdo org.springframework.cloud.netflix.feignpacote.
Tomáš Záluský
3
Questão em JetBrains bug tracker está aqui: youtrack.jetbrains.com/issue/IDEA-168155
Josef Reichardt
3

Configure o contexto do aplicativo e tudo ficará bem.

insira a descrição da imagem aqui

Arayik Harutyunyan
fonte
2

E uma última informação importante - adicione a ComponentScanpara que o aplicativo saiba tudo o que precisa ser conectado. Isso não é relevante no caso desta pergunta. No entanto, se não @autowiringestiver sendo executado, é provável que seja a sua solução.

@Configuration
@ComponentScan(basePackages = {
    "some_package",
})
public class someService {
HankCa
fonte
Isso faz sentido e fez o truque para mim. Por que desativar os avisos? Os avisos devem funcionar como esperado!
WebComer 5/03
2

O que você precisa fazer é adicionar

@ComponentScan("package/include/your/annotation/component") no AppConfiguration.java.

Como acho que o AppConfiguraion.javapacote do seu é mais profundo que o pacote do componente de anotação (@Service, @Component ...),

tais como "package/include/your/annotation/component/deeper/config".

sfwn
fonte
@ComponentScan ("package.include.your.annotation.component")!
Iakov Senatov 29/01
2

Eu tive um problema semelhante no meu aplicativo. Quando adicionei anotações, a marcação incorreta desapareceu.

@ContextConfiguration(classes = {...})
K. Gol
fonte
somente para pacotes de teste!
Iakov Senatov 29/01
2

Estou usando esta anotação para ocultar esse erro quando ele aparece no IntelliJ v.14:

@SuppressWarnings("SpringJavaAutowiringInspection")
Miguel Ángel Medina Aguilar
fonte
Quando autowired em um construtor é@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
Loren
2

Para mim, a solução foi colocar @EnableAutoConfigurationna classe Application sob a forma @SpringBootApplicationde sublinhar, porque é redundante. Exclua-o e pronto, todos os avisos sobre os grãos ausentes desaparecem! Primavera parva ...

Farkas Archie Bako
fonte
2

no meu caso, o diretório que eu estava tentando @Autowired não estava no mesmo nível,

depois de configurá-lo no mesmo nível de estrutura, o erro desapareceu

espero que possa ajudar alguém!

Davel_AG
fonte
1

Minha solução para esse problema no meu aplicativo de inicialização do Spring foi abrir o contexto do aplicativo do Spring e adicionar a classe manualmente para o bean com conexão automática ausente!

(acesse através do menu Estrutura do projeto ou janela da ferramenta Primavera ... editar "Contexto do aplicativo Primavera")

Portanto, em vez de SpringApplicationContext apenas conter minha configuração de mola ExampleApplication, ela também contém o Bean ausente:

SpringApplicationContext:

  • ExampleApplication.java
  • MissingBeanClass.java

et voilà: A mensagem de erro desapareceu!

UV
fonte
1

Ainda parece haver um bug no IntelliJ mais recente e está relacionado a um possível problema de armazenamento em cache?

Se você adicionar a anotação @Repository como mk321 mencionada acima, salve, remova a anotação e salve novamente, isso corrige o problema.

Jensen Buck
fonte
1

Tudo o que você precisa fazer para fazer isso funcionar é o seguinte código:

@ComponentScan
public class PriceWatchTest{

    @Autowired
    private PriceWatchJpaRepository priceWatchJpaRepository;
...
...
}
olammy
fonte
1

Eu só tinha que usar @EnableAutoConfiguration para resolvê-lo, no entanto, esse erro não teve impacto funcional.

Smart Coder
fonte
1

Isso pode ser resolvido colocando @EnableAutoConfiguration na classe principal do aplicativo de inicialização por primavera.

Nirbhay Rana
fonte
0

Às vezes - no meu caso - a razão é uma importação errada. Acidentalmente importei

import org.jvnet.hk2.annotations.Service

ao invés de

import org.springframework.stereotype.Service

aceitando cegamente a primeira opção nas importações sugeridas pela Idea. Levei alguns minutos na primeira vez que aconteceu :-)

Christoph Grimmer-Dietrich
fonte
0

Surpreendentemente, um projeto orientado a Feign que foi executado com sucesso com o Eclipse não pôde ser executado no InteliJ. Quando o aplicativo foi iniciado, o InteliJ reclamou do cliente Feign que tentei injetar na camada serviceImpl dizendo: campo personRestClient (meu cliente Feign) em ... exigia um bean do tipo ... que não pôde ser encontrado. Considere definir um bean do tipo '....' em sua configuração.

Perdi muito tempo tentando entender o que está errado. Encontrei uma solução (para InteliJ) que não entendo completamente:

  1. Alt Shift F10 (ou menu de execução)
  2. Selecione 'Editar configuração'
  3. Na janela de configuração, marque a caixa de seleção 'incluir dependências com escopo "Fornecido"'
  4. Execute seu aplicativo

Ou escolha Eclipse :)

ylev
fonte
0

Verifique se o pacote do seu bean está escrito corretamente

//Check if this is written right 
package com.package1.package2.package3


import ...

@Service
class ServiceX {

  ...

}
Jöcker
fonte
0

Use @AutoConfigureMockMvc para a classe de teste.

Harshad Thombare
fonte
0

Resolvi o problema instalando o plugin mybatis no IDEA. Quando instalei o Mybatis Plugin, ele desapareceu.

Snkpty
fonte
0

simples você tem que fazer 2 etapas

  1. adicionar depandência do núcleo de hibernação
  2. altere @Autowired para @Resource.
==>> change @Autowired to  @Resource
Er.Rk Yadav
fonte
Explique sua resposta.
mentallurg
0

IntelliJ IDEA Ultimate

Adicione sua classe principal ao IntelliJ Spring Application Context, por exemplo Application.java

File -> Project Structure..

lado esquerdo: Configuração do projeto -> Módulos

lado direito: encontre na estrutura do seu pacote Springe adicione+ Application.java

Anton Bondarenko
fonte
É igual à resposta UV
Anton Bondarenko