"Alan, bulunamayan türde bir fasulye gerektiriyordu." mongodb kullanarak hata yay dinlendirici API


101

Bu yüzden haftanın çiftlerinde Bahar öğreniyorum, bu öğreticiyi takip ediyorum

RESTful Web Hizmeti Oluşturma

Onu mongodb'a entegre etmeye çalışana kadar her şey yolundaydı. Bu yüzden bu öğreticiyi takip ediyorum.

MongoDB ile Verilere Erişim

Ama benim pratiğim kısmen hala ilkini kullanıyor. Yani proje dizin yapım şu şekilde.

src/
├── main/
│   └── java/
|       ├── model/
|       |   └── User.java
|       ├── rest/
|       |   ├── Application.java
|       |   ├── IndexController.java
|       |   └── UsersController.java
|       └── service/
|           └── UserService.java
└── resources/
    └── application.properties

Bu benim olduğu model / User.java dosyası

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

Bu benim olduğu dinlenme / UsersController.java dosyası

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

Bu benim olduğu hizmet / UserService.java dosyası

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

Onları derleyebilirdim (derleme için gradle kullanıyorum çünkü öğreticiyi takip ediyorum), ancak jar dosyasını çalıştırdığımda bu hatayı veriyordu.


BAŞVURU BAŞLATILAMADI


Açıklama:

Main.java.rest.UsersController içindeki userService alanı, bulunamayan 'main.java.service.UserService' türünde bir bean gerektiriyordu.

Aksiyon:

Yapılandırmanızda 'main.java.service.UserService' türünde bir bean tanımlamayı düşünün.

Neyin yanlış olduğundan emin değilim Beans.xml, etrafta dolaşmaya başladım ve dosyayı dahil etmem ve userService'i buna kaydetmem gerektiğini buldum. Bunu yaptım ama işe yaramıyor. Bu işte gerçekten yeniyim, bu yüzden neler olup bittiğine dair hiçbir fikrim yok.

Yanıtlar:


161

Çözüldü. Bu nedenle varsayılan olarak, @SpringBootApplicationbeyan kapsamına giren tüm paketler taranacaktır.

Benim ana sınıf varsayarsak ExampleApplicationvardır @SpringBootApplicationiçeride bildirildi beyanı com.example.somethingaltına düştüğünde tüm bileşenlerin daha sonra com.example.somethingise taranır com.example.applicanttaranan edilmeyecektir.

Yani, bu soruya dayanarak bunu yapmanın iki yolu var . Kullanım

@SpringBootApplication(scanBasePackages={
"com.example.something", "com.example.application"})

Bu şekilde, uygulama belirtilen tüm bileşenleri tarayacaktır, ancak bence ya ölçek büyüyor olsaydı?

Bu yüzden paketleri yeniden yapılandırarak ikinci yaklaşımı kullandım ve işe yaradı! Artık paket yapım böyle oldu.

src/
├── main/
│   └── java/
|       ├── com.example/
|       |   └── Application.java
|       ├── com.example.model/
|       |   └── User.java
|       ├── com.example.controller/
|       |   ├── IndexController.java
|       |   └── UsersController.java
|       └── com.example.service/
|           └── UserService.java
└── resources/
    └── application.properties

Aslında pek bir şey değişmedi, sadece paketlerin ve sınıfların bazılarını yeniden adlandırdım @GuoJing
Eka Rudianto

@ekaRudianto Bir yazım hatası var. Hiçbir açılış {içinscanBasePackages= "com.example.something","com.example.application"
brk

Ben de aynı sorunu yaşadım ve paket yapımın doğru sırada olmadığını anladım. Onları bu şekilde yeniden düzenledim ve şimdi iyi çalışıyor.
Vimukthi Sineth

73

Ekle @Serviceservis / UserService.java içinde.


20

Ben de aynı hatayı aldım:

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

Ve paketlerim, kabul edilen cevapta belirtildiği gibi oluşturuldu. Sorunumu ana sınıfa şu şekilde EnableMongoRepositories ek açıklaması ekleyerek düzelttim:

@SpringBootApplication
@EnableMongoRepositories(basePackageClasses = CustomerRepository.class)
public class CampaignAPI {

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

Birden fazla eklemeniz gerekiyorsa küme parantezlerini unutmayın:

@EnableMongoRepositories(basePackageClasses
    = {
        MSASMSRepository.class, APartyMappingRepository.class
    })

14

Aynı sorunla karşılaştım ve tek yapmam gereken Uygulamayı hizmet, dao ve etki alanı paketlerinden bir seviye daha yüksek bir pakete yerleştirmekti.


12

Bu ileti dizisi artık eski ama cevabımı gönderiyorum, bu diğerleri için faydalı olabilir.

Ben de aynı sorunu yaşadım. Diğer modülde aynı isimde başka bir sınıf olduğu ortaya çıktı. Bu sınıfı yeniden adlandırdım ve sorunu çözdü.


10

Otomatik içe aktarma nedeniyle çok zaman harcadı. Intellij Idea bir şekilde yerine ithal @Serviceedildi !import org.jvnet.hk2.annotations.Service;import org.springframework.stereotype.Service;


Cevabınızı günceller ve ne yaptığınızı açıklar mısınız? Şimdiden çok teşekkürler
MZaragoza

3
Cevabımdan ne anlamadınız? Projeyi çalıştırmaya çalışırken sorudakiyle aynı hatayı aldım. ServiceYanlış kitaplıktan içe aktardığım içindir.
Vitali Kuzmin

@VitaliKuzmin hala cevabınızda netlik yok. Cevabınız doğru olabilir ve sizin için işe yaramış olabilir, ancak burada sunduğunuz yol kafa karıştırıcı ve okuyucu dostu değil
18:39

3
@mannedear İlk yorumumun sizin yorumunuzun da yanıtladığını düşünüyorum.
Vitali Kuzmin

Ben de bir içe aktarma hatası yaptığım için bu yanıtı + 1'ledi! : Modelimdeki import javax.persistence.Table;yerine 0 import org.springframework.data.relational.core.mapping.Table;. smh bu fasulye hatasını ayıklarken 5 saat kaybetti.
kalpaj agrawalla



5

Normalde bu sorunu iki açıdan çözebiliriz:

  1. Uygun ek açıklama için kullanılmalıdır Bahar Boot tarayarak fasulye gibi @Component;
  2. Tarama yolu diğerleri yukarıda belirtilen tıpkı sınıfları içerecektir.

Bu arada, @Component, @Repository, @Service ve @Controller arasındaki fark için çok iyi bir açıklama var .


3

Dao sınıfınıza @Repository ekleyin

misal:

@Repository
public class DaoClassName implements IIntefaceDao {
}

2

Tüm @ Ek Açıklamaları kullanmak sorunumu çözdü. (Evet, Spring'de yeniyim) Bir hizmet sınıfı kullanıyorsanız @Service ekleyin ve aynısını @Controller ve @Repository için de yapın.

Sonra App.java'daki bu açıklamalar sorunu çözdü (JPA + Hazırda Bekletme kullanıyorum)

@SpringBootApplication
@EnableAutoConfiguration(exclude = { ErrorMvcAutoConfiguration.class })
@ComponentScan(basePackages = {"es.unileon.inso2"})
@EntityScan("es.unileon.inso2.model")
@EnableJpaRepositories("es.unileon.inso2.repository")

Paket ağacı:

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

2

@EnableMongoRepositories ("in.topthree.util") ekleyerek düzeltilen aynı Soruna sahibim

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

}

Ve Depom:

package in.topthree.util;

import org.springframework.data.mongodb.repository.MongoRepository;

public interface StudentMongo extends MongoRepository<Student, Integer> {

    public Student findByUrl(String url);
}

Şimdi Çalışıyor


2

Denetleyiciden @Autowired Annotation'ı kaldırdım da aynı sorunu yaşadım. Deponuz bir sınıfsa, depoyu kullanmak için Otomatik Kablolanmış Ek Açıklama gerekir, ancak bu bir arabirim olduğunda, deneyimime göre @ Otomatik Kablolu Ek Açıklamayı eklemenize gerek yoktur.


1

Hedef klasörümdeki Mapper uygulama sınıflarım silinmişti, bu nedenle Mapper arayüzlerim artık uygulama sınıflarına sahip değildi. Böylece aynı hatayı aldımField *** required a bean of type ***Mapper that could not be found.

Haritacı uygulamalarımı maven ile yeniden oluşturmak ve projeyi yenilemek zorunda kaldım ...


1

Mongo Deposu ile Spring Webflux kullanırken yardım arayan bu yazıya geldim.

Hatam sahibine benziyordu

Field usersRepository in foobar.UsersService required
a bean of type 'foobar.UsersRepository' that could not be found.

Daha önce Spring MVC ile çalışırken bu hataya şaşırmıştım.

Yardım bulmak o kadar açık olmadığından, bu soruya bir şekilde alakalı olduğu ve bu soru arama sonuçlarında yüksek olduğu için cevap veriyorum.

İlk olarak, kabul edildi olarak işaretlenen yanıtta bahsedilen paket hiyerarşisini hatırlamanız gerekir.

İkinci önemli şey, Webflux kullanıyorsanız, örneğin MongoDB için Spring MVC kullanırken farklı bir paket kullanmanız gerektiğidir.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>

ile reaktifT sonunda.


1

Ben de aynı sorunu yaşadım. Hatam, Servis Arayüzünde @ Servis ek açıklamasını kullanmamdı. @Service ek açıklaması ServiceImpl sınıfına uygulanmalıdır.


1

Dao sınıfınıza @Repository ekleyin

    @Repository
    public interface UserDao extends CrudRepository<User, Long> {
         User findByUsername(String username);
         User findByEmail(String email);    
      }

CrudRepository'yi zaten genişletirseniz @Repository eklemenize gerek yoktur
Karen Goh

1

Spring boot kullanıyorsanız, spring-boot-starter-data-jpa'yı bağımlı olarak içe aktarmanız gerekir


1

Fasulye oluşturmak ve enjekte etmek için yay için sınıf , bağlamınıza göre @ Componet, @ service, @ Repository vb. İle işaretlenmelidir .

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

0

Bu, iki fasulyenin aynı ada sahip olması durumunda olabilir.

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

Adlandırılmış bir fasulye retrofitServiceönce oluşturulur ve türü olur GoogleAPI, ardından GithubAPIher ikisi de bir retrofitService()yöntemle oluşturuldukları için kapsanır . Şimdi ne zaman @Autowiredbir GoogleAPIsen gibi bir mesaj alırsınızField googleAPI in com.example.GoogleService required a bean of type 'com.example.rest.GoogleAPI' that could not be found.


0

Benim durumumda, MyprojectApplication Sınıfını bir pakete (com.example.start) aynı model, kontrolör, servis paketleri seviyesiyle koydum.


0

Eski olduğunu biliyorum ama 5 sentimi eklemek istiyorum.

Ben kullanılan .serviceve .service.implbir klasör yapısı içinde 's uygulanmasına hizmet ayırmak için. ServiceImplementation parçasını uygulamayı unutun.


0

Benim için bu mesaj:

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

"Üstteki küçük birim testimde o fasulyeyi manuel olarak eklemeniz gerekiyor" anlamına geliyordu

appContext.putBean(myClass);

0

Burada OP tarafından takip edilen tüm adımları ve talimatları izledim, kullanıcı adı ve parola etrafındaki boş alanı hallettim (bahar özellikler dosyasındaki boşluklarla ilgilense bile)

could not find bean for ___Repository

(JPARepository'yi genişleten arayüzünüz)

VEYA @EnableJPARepository ekledikten sonra

could not find bean for EntityManagerFactory

pom.xml'de spring boot starter ana sürümünü 2.3.2'den 2.2.1'e değiştirerek çözdüm

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

ve aşağıdaki bağımlılığı eklemek

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

Aşağıdakilerden herhangi birini eklememe gerek yoktu, yaylı önyükleme kendisi yapıyor

  1. @EnableJPAReposity - zaten aynı kök paketine sahip tüm sınıfa sahip olduğum için
  2. spring.data.jpa.repositories.enabled içinde application.properties
  3. spring.datasource.driverClassName = com.mysql.jdbc.Uygulama özelliklerinde sürücü

0

Buraya genel fasulye hata mesajını gözden geçirerek getirilen, ancak aslında istemci arayüzünüzdeki açıklama yoluyla Spring Boot uygulamasına sahte bir istemci eklemeye çalışan herkes için, @FeignClientyukarıdaki çözümlerden hiçbiri sizin için işe yaramayacaktır.

Sorunu çözmek için @EnableFeignClientsek açıklamayı Uygulama sınıfınıza eklemeniz gerekir , örneğin:

@SpringBootApplication
// ... (other pre-existing annotations) ...
@EnableFeignClients // <------- THE IMPORTANT ONE
public class Application {

Bu şekilde, @EnableMongoRepositoriesdüzeltme yukarıda belirtilen düzeltmeye benzer . Bu genel hata mesajının her tür durum için bu kadar özel bir düzeltme gerektirmesi utanç verici ...


0

İki tür mongo bağımlılığı -

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

İki tür depo -

MongoRepository
ReactiveMongoRepository

Doğru kombinasyonu kullandığınızdan emin olun.


-1

Bunu kullanmak sorunumu çözdü.

@SpringBootApplication(scanBasePackages={"com.example.something", "com.example.application"})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.