Estou aprendendo a primavera nos casais da semana, seguindo este tutorial
Construindo um serviço da Web RESTful
Tudo estava bem até que tentei integrá-lo ao mongodb. Então, sigo este tutorial.
Mas minha prática ainda está parcialmente usando o primeiro. Portanto, minha estrutura de diretório de projeto é assim.
src/
├── main/
│ └── java/
| ├── model/
| | └── User.java
| ├── rest/
| | ├── Application.java
| | ├── IndexController.java
| | └── UsersController.java
| └── service/
| └── UserService.java
└── resources/
└── application.properties
Este é meu modelo / arquivo User.java
package main.java.model;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection="user")
public class User {
private int age;
private String country;
@Id
private String id;
private String name;
public User() {
super();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
Este é o meu resto / arquivo UsersController.java
package main.java.rest;
import java.util.List;
import main.java.service.UserService;
import main.java.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/users")
public class UsersController {
@Autowired
UserService userService;
@RequestMapping(method = RequestMethod.GET)
public List<User> getAllUsers() {
return userService.findAll();
}
}
Este é o meu arquivo service / UserService.java
package main.java.service;
import java.util.List;
import main.java.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface UserService extends MongoRepository<User, String> {
public List<User> findAll();
}
Eu poderia compilá-los (estou usando o gradle para compilação porque estou seguindo o tutorial), mas quando executei o arquivo jar ele estava gerando este erro.
APLICAÇÃO FALHOU AO INICIAR
Descrição:
O campo userService em main.java.rest.UsersController exigiu um bean do tipo 'main.java.service.UserService' que não foi encontrado.
Açao:
Considere definir um bean do tipo 'main.java.service.UserService' em sua configuração.
Não tenho certeza do que está errado, comecei a pesquisar no Google e descobri que preciso incluir o Beans.xml
arquivo e registrar o userService nele. Eu fiz isso, mas não está funcionando. Eu sou muito novo nisso, então eu realmente não tenho ideia do que está acontecendo.
{
parascanBasePackages= "com.example.something","com.example.application"
Adicione o
@Service
no serviço / UserService.java.fonte
Eu também tive o mesmo erro:
*************************** APPLICATION FAILED TO START *************************** Description: Field repository in com.kalsym.next.gen.campaign.controller.CampaignController required a bean of type 'com.kalsym.next.gen.campaign.data.CustomerRepository' that could not be found. Action: Consider defining a bean of type 'com.kalsym.next.gen.campaign.data.CustomerRepository' in your configuration.de here
E meus pacotes foram construídos da mesma forma mencionada na resposta aceita. Corrigi meu problema adicionando a anotação EnableMongoRepositories na classe principal como esta:
@SpringBootApplication @EnableMongoRepositories(basePackageClasses = CustomerRepository.class) public class CampaignAPI { public static void main(String[] args) { SpringApplication.run(CampaignAPI.class, args); } }
Se você precisar adicionar vários, não se esqueça das chaves:
@EnableMongoRepositories(basePackageClasses = { MSASMSRepository.class, APartyMappingRepository.class })
fonte
Eu encontrei o mesmo problema e tudo que tive que fazer foi colocar o aplicativo em um pacote um nível acima dos pacotes de serviço, dao e domínio.
fonte
Este tópico é antigo, mas estou postando minha resposta, que pode ser útil para outras pessoas.
Eu tive o mesmo problema. Descobriu-se que existe outra classe com o mesmo nome em outro módulo. Eu renomeei essa classe e isso resolveu o problema.
fonte
Gastou muito tempo por causa da importação automática. Intellij Idea importou de alguma forma
@Service
emimport org.jvnet.hk2.annotations.Service;
vez deimport org.springframework.stereotype.Service;
!fonte
Service
da biblioteca errada.import javax.persistence.Table;
vez deimport org.springframework.data.relational.core.mapping.Table;
no meu modelo. smh perdeu 5 horas na depuração desse erro de bean.Você deve adicionar a
@Service
anotação à implementação do seu serviço.fonte
Normalmente podemos resolver esse problema em dois aspectos:
@Component
;A propósito, há uma explicação muito boa para a diferença entre @Component, @Repository, @Service e @Controller .
fonte
Adicione o @Component em sua classe de controlador. Que isso funcione
fonte
Adicionar @Repository em sua classe dao
exemplo:
@Repository public class DaoClassName implements IIntefaceDao { }
fonte
Usar todas as anotações @ corrigiu meu problema. (Sim, sou novo no Spring) Se você estiver usando uma classe de serviço, adicione @Service e o mesmo para @Controller e @Repository.
Então, essas anotações no App.java corrigiram o problema (estou usando JPA + Hibernate)
@SpringBootApplication @EnableAutoConfiguration(exclude = { ErrorMvcAutoConfiguration.class }) @ComponentScan(basePackages = {"es.unileon.inso2"}) @EntityScan("es.unileon.inso2.model") @EnableJpaRepositories("es.unileon.inso2.repository")
Árvore de pacotes:
src/ ├── main/ │ └── java/ | ├── es.unileon.inso2/ | | └── App.java | ├── es.unileon.inso2.model/ | | └── User.java | ├── es.unileon.inso2.controller/ | | ├── IndexController.java | | └── UserController.java | ├── es.unileon.inso2.service/ | | └── UserService.java | └── es.unileon.inso2.repository/ | └── UserRepository.java └── resources/ └── application.properties
fonte
Eu tenho o mesmo problema, corrigido pela adição de @EnableMongoRepositories ("in.topthree.util")
package in.topthree.core; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import in.topthree.util.Student; @SpringBootApplication @EnableMongoRepositories("in.topthree.util") public class Run implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(Run.class, args); System.out.println("Run"); } @Autowired private Process pr; @Override public void run(String... args) throws Exception { pr.saveDB(new Student("Testing", "FB")); System.exit(0); } }
E meu Repositório é:
package in.topthree.util; import org.springframework.data.mongodb.repository.MongoRepository; public interface StudentMongo extends MongoRepository<Student, Integer> { public Student findByUrl(String url); }
Agora está funcionando
fonte
Eu tive o mesmo problema. Meu erro foi usar a anotação @Service na interface de serviço. A anotação @Service deve ser aplicada à classe ServiceImpl.
fonte
Eu tive o mesmo problema de remover a anotação @Autowired do controlador. Se o seu repositório for uma classe, a anotação Autowired é necessária para usar o repositório, mas quando for uma interface, você não precisa adicionar a anotação @Autowired por experiência própria.
fonte
Minhas classes de implementação do Mapper em minha pasta de destino foram excluídas, então minhas interfaces do Mapper não tinham mais classes de implementação. Portanto, obtive o mesmo erro
Field *** required a bean of type ***Mapper that could not be found.
Eu simplesmente tive que regenerar minhas implementações de mapeadores com o maven e atualizar o projeto ...
fonte
Eu vim para este post em busca de ajuda ao usar Spring Webflux com o Mongo Repository.
Meu erro foi semelhante ao do proprietário
Field usersRepository in foobar.UsersService required a bean of type 'foobar.UsersRepository' that could not be found.
Como eu estava trabalhando antes com Spring MVC, fiquei surpreso com esse erro.
Como encontrar ajuda não era tão óbvio, estou respondendo a esta pergunta, pois de alguma forma está relacionada e esta pergunta está no topo dos resultados de pesquisa.
A primeira coisa é que você deve se lembrar do que foi mencionado na resposta marcada como aceita - hierarquia de pacotes.
A segunda coisa importante é que se você usar o Webflux, você precisa usar algum pacote diferente ao usar o Spring MVC, por exemplo, para MongoDB, você precisa adicionar
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId> </dependency>
com -reactive no final.
fonte
Adicione @Repository em sua classe dao
@Repository public interface UserDao extends CrudRepository<User, Long> { User findByUsername(String username); User findByEmail(String email); }
fonte
você tem que importar spring-boot-starter-data-jpa como dependeny se você usar spring boot
fonte
A fim de criar o bean e injetá-lo, a classe deve ser marcada com @ Componet, @ service, @ Repository etc em seu contexto, deve ser
package main.java.service; import java.util.List; import main.java.model.User; import org.springframework.data.mongodb.repository.MongoRepository; @Repository public interface UserService extends MongoRepository<User, String> { public List<User> findAll(); }
fonte
Isso pode acontecer quando dois grãos têm os mesmos nomes.
Module1Beans.java
:@Configuration public class Module1Beans { @Bean public GoogleAPI retrofitService(){ Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://www.google.com/") .addConverterFactory(JacksonConverterFactory.create()) .build(); return retrofit.create(GoogleAPI.class); } }
Module2Beans.java
:@Configuration public class Module2Beans { @Bean public GithubAPI retrofitService(){ Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://www.github.com/") .addConverterFactory(JacksonConverterFactory.create()) .build(); return retrofit.create(GithubAPI.class); } }
Um bean denominado
retrofitService
é primeiro criado e seu tipo éGoogleAPI
, então coberto por umGithubAPI
porque ambos são criados por umretrofitService()
método. Agora, quando você@Autowired
umGoogleAPI
você receber uma mensagem comoField googleAPI in com.example.GoogleService required a bean of type 'com.example.rest.GoogleAPI' that could not be found.
fonte
No meu caso, acabei de colocar a classe MyprojectApplication em um pacote (com.example.start) com o mesmo nível de modelo, controlador, pacotes de serviço.
fonte
Eu sei que é antigo, mas quero adicionar meus 5 centavos.
Usei
.service
e.service.impl
em uma estrutura de pasta para separar o serviço com sua implementação. Esqueça de implementar a parte ServiceImplementation.fonte
Para mim esta mensagem:
org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor 'public org.package.MyClass(org.apache.wicket.request.mapper.parameter.PageParameters)' and argument ''. Might be it doesn't exist, may be it is not visible (public).
significava "no meu teste de unidade do postigo no topo, você tem que adicionar manualmente esse feijão como"
appContext.putBean(myClass);
fonte
Eu segui todas as etapas e instruções seguidas pelo OP aqui, cuidei do espaço em branco ao redor do nome de usuário e senha (embora o spring cuide dos espaços em branco no arquivo de propriedades), ainda estava voltado para
could not find bean for ___Repository
(sua interface que estende JPARepository)
OU depois de adicionar @EnableJPARepository
could not find bean for EntityManagerFactory
Eu resolvi isso mudando a versão principal do spring boot starter de 2.3.2 para 2.2.1 em pom.xml
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent>
e adicionar a seguinte dependência
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
Não precisei adicionar nenhum dos itens a seguir, a bota de mola faz isso sozinha
fonte
Para qualquer um que foi trazido aqui pesquisando a mensagem de erro do bean genérico, mas que está realmente tentando adicionar um cliente simulado ao aplicativo Spring Boot por meio do
@FeignClient
anotação na interface do cliente, nenhuma das soluções acima funcionará para você.Para corrigir o problema, você precisa adicionar a
@EnableFeignClients
anotação à sua classe Application, assim:@SpringBootApplication // ... (other pre-existing annotations) ... @EnableFeignClients // <------- THE IMPORTANT ONE public class Application {
Desta forma, a correção é semelhante à
@EnableMongoRepositories
correção mencionada acima. É uma pena que esta mensagem de erro genérica exija uma correção personalizada para cada tipo de circunstância ...fonte
Dois tipos de dependências mongo -
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
Dois tipos de repositórios -
Certifique-se de usar a combinação certa.
fonte
Usar isso resolveu meu problema.
@SpringBootApplication(scanBasePackages={"com.example.something", "com.example.application"})
fonte