'Bidang membutuhkan jenis biji yang tidak dapat ditemukan.' error spring restful API menggunakan mongodb


104

Jadi saya telah belajar Spring dalam beberapa minggu, mengikuti tutorial ini

Membangun Layanan Web yang RESTful

Semuanya baik-baik saja sampai saya mencoba mengintegrasikannya ke mongodb. Jadi saya mengikuti tutorial ini.

Mengakses Data dengan MongoDB

Namun praktik saya sebagian masih menggunakan yang pertama. Jadi struktur direktori proyek saya seperti ini.

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

Ini adalah file model / User.java saya

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

Ini adalah file / UsersController.java saya

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

Ini adalah file service / UserService.java saya

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

Saya dapat mengkompilasinya (saya menggunakan gradle untuk kompilasi karena saya mengikuti tutorial), tetapi ketika saya menjalankan file jar, kesalahan ini muncul.


APLIKASI GAGAL UNTUK MEMULAI


Deskripsi:

Bidang userService di main.java.rest.UsersController membutuhkan kacang jenis 'main.java.service.UserService' yang tidak dapat ditemukan.

Tindakan:

Pertimbangkan untuk mendefinisikan kacang berjenis 'main.java.service.UserService' dalam konfigurasi Anda.

Tidak yakin apa yang salah, saya mulai Beans.xmlmencari-cari di Google dan menemukan bahwa saya perlu menyertakan file dan mendaftarkan userService di dalamnya. Saya melakukan itu tetapi tidak berhasil. Saya benar-benar baru dalam hal ini jadi saya benar-benar tidak tahu apa yang terjadi.

Jawaban:


162

Pecahkan itu. Jadi secara default, semua paket yang termasuk dalam @SpringBootApplicationdeklarasi akan dipindai.

Dengan asumsi kelas utama saya ExampleApplicationyang memiliki @SpringBootApplicationdeklarasi dideklarasikan di dalam com.example.something, maka semua komponen yang berada di bawah com.example.somethingdipindai sementara com.example.applicanttidak akan dipindai.

Jadi, ada dua cara untuk melakukannya berdasarkan pertanyaan ini . Menggunakan

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

Dengan begitu, aplikasi akan memindai semua komponen yang ditentukan, tetapi saya pikir bagaimana jika skalanya semakin besar?

Jadi saya menggunakan pendekatan kedua, dengan merestrukturisasi paket saya dan berhasil! Sekarang struktur paket saya menjadi seperti ini.

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

sebenarnya tidak banyak yang berubah, saya baru saja mengganti nama paket dan kelasnya @GuoJing
Eka Rudianto

@ekaRudianto Ada kesalahan ketik. Tidak ada pembukaan {untukscanBasePackages= "com.example.something","com.example.application"
brk

Saya juga mengalami masalah yang sama dan menemukan bahwa struktur paket saya tidak dalam urutan yang benar. Saya mengatur ulang mereka seperti ini dan sekarang bekerja dengan baik.
Vimukthi Sineth


21

Saya juga mengalami kesalahan yang sama:

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

Dan paket saya dibuat dengan cara yang sama seperti yang disebutkan dalam jawaban yang diterima. Saya memperbaiki masalah saya dengan menambahkan anotasi EnableMongoRepositories di kelas utama seperti ini:

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

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

Jika Anda perlu menambahkan beberapa, jangan lupa tanda kurung kurawal:

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

14

Saya mengalami masalah yang sama dan yang harus saya lakukan adalah menempatkan Aplikasi dalam paket satu tingkat lebih tinggi dari paket layanan, dao, dan domain.


12

Utas ini sudah lama sekarang tetapi saya memposting jawaban saya, yang semoga bermanfaat bagi orang lain.

Saya memiliki masalah yang sama. Ternyata ada kelas lain dengan nama yang sama di modul lain. Saya mengganti nama kelas itu dan itu menyelesaikan masalah.


10

Menghabiskan banyak waktu karena impor otomatis. Ide Intellij entah mengapa diimpor @Servicedari import org.jvnet.hk2.annotations.Service;alih-alih import org.springframework.stereotype.Service;!


Bisakah Anda memperbarui jawaban Anda dan menjelaskan apa yang Anda lakukan. Terima kasih banyak sebelumnya
MZaragoza

3
Apa yang tidak Anda mengerti dari jawaban saya? Saya mendapat kesalahan yang sama seperti dalam pertanyaan, mencoba menjalankan proyek. Itu karena saya telah mengimpor Servicedari perpustakaan yang salah.
Vitali Kuzmin

@VitaliKuzmin masih belum ada kejelasan jawaban kalian. Jawaban Anda mungkin benar dan mungkin berhasil untuk Anda, tetapi cara Anda disajikan di sini membingungkan dan tidak ramah pembaca
dengar

3
@mannedear Saya rasa komentar pertama saya menjawab komentar Anda juga.
Vitali Kuzmin

Memberi jawaban ini +1, karena saya juga membuat kesalahan impor! : 0 import javax.persistence.Table;bukannya import org.springframework.data.relational.core.mapping.Table;di model saya. smh kehilangan 5 jam dalam men-debug kesalahan kacang ini.
kalpaj agrawalla


6

Biasanya kita dapat menyelesaikan masalah ini dalam dua aspek:

  1. anotasi yang tepat harus digunakan untuk pemindaian Spring Boot kacang , seperti @Component;
  2. yang scanning jalan akan mencakup kelas sama seperti semua orang lain yang disebutkan di atas.

Ngomong-ngomong, ada penjelasan yang sangat bagus untuk perbedaan antara @Component, @Repository, @Service, dan @Controller .



3

Tambahkan @Repository di kelas dao Anda

contoh:

@Repository
public class DaoClassName implements IIntefaceDao {
}

2

Menggunakan semua @ Anotasi memperbaiki masalah saya. (Ya, saya baru mengenal Spring) Jika Anda menggunakan kelas layanan tambahkan @Service, dan sama untuk @Controller dan @Repository.

Kemudian anotasi di App.java ini memperbaiki masalah (Saya menggunakan JPA + Hibernate)

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

Pohon paket:

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

Saya memiliki Masalah yang sama, diperbaiki dengan Menambahkan @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);
    }

}

Dan Repositori saya adalah:

package in.topthree.util;

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

public interface StudentMongo extends MongoRepository<Student, Integer> {

    public Student findByUrl(String url);
}

Sekarang Bekerja


2

Saya memiliki masalah yang sama. Kesalahan saya adalah saya menggunakan anotasi @Service di Service Interface. Anotasi @Service harus diterapkan ke kelas ServiceImpl.


2

Saya memiliki masalah yang sama dengan saya menghapus Anotasi @Autowired dari pengontrol. Jika repositori Anda adalah kelas, maka Anotasi Otomatis diperlukan untuk menggunakan repositori, tetapi jika itu adalah antarmuka Anda tidak perlu menambahkan Anotasi @Autowired dari pengalaman saya.


1

Kelas implementasi Mapper saya di folder target saya telah dihapus, jadi antarmuka Mapper saya tidak memiliki kelas implementasi lagi. Jadi saya mendapat kesalahan yang samaField *** required a bean of type ***Mapper that could not be found.

Saya hanya perlu meregenerasi implementasi pembuat peta saya dengan maven, dan menyegarkan proyek ...


1

Saya datang ke posting ini untuk mencari bantuan saat menggunakan Spring Webflux dengan Mongo Repository.

Kesalahan saya mirip dengan pemilik

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

Saat saya bekerja sebelumnya dengan Spring MVC, saya terkejut dengan kesalahan ini.

Karena menemukan bantuan tidak begitu jelas, saya memberikan jawaban untuk pertanyaan ini karena terkait dan pertanyaan ini tinggi dalam hasil pencarian.

Hal pertama yang harus Anda ingat tentang apa yang disebutkan dalam jawaban yang ditandai sebagai diterima - hierarki paket.

Hal penting kedua adalah jika Anda menggunakan Webflux Anda perlu menggunakan beberapa paket yang berbeda saat menggunakan Spring MVC misalnya untuk MongoDB Anda perlu menambahkan

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

dengan -reaktif di akhir.


1

Tambahkan @Repository di kelas dao Anda

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

tidak perlu menambahkan @Repository jika Anda sudah memperluas CrudRepository
Karen Goh

1

Anda harus mengimpor spring-boot-starter-data-jpa sebagai dependeny jika Anda menggunakan spring boot


1

Untuk membuat untuk membuat kacang dan menyuntikkannya kelas harus ditandai dengan @ Komponen, @ layanan, @ Repositori dll dalam konteks Anda seharusnya

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

Ini mungkin terjadi jika dua biji memiliki nama yang sama.

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

Sebuah biji bernama retrofitServicepertama kali dibuat, dan tipenya adalah GoogleAPI, kemudian ditutup oleh GithubAPIkarena keduanya dibuat dengan sebuah retrofitService()metode. Sekarang ketika Anda @Autowiredseorang GoogleAPIAnda akan mendapatkan pesan sepertiField googleAPI in com.example.GoogleService required a bean of type 'com.example.rest.GoogleAPI' that could not be found.


0

Dalam kasus saya, saya baru saja meletakkan Kelas MyprojectApplication dalam sebuah paket (com.example.start) dengan tingkat model, pengontrol, paket layanan yang sama.


0

Saya tahu ini sudah tua, tetapi ingin menambahkan 5 sen saya.

Saya menggunakan .servicedan .service.impldalam struktur folder untuk memisahkan layanan dengan implementasinya. Lupakan untuk mengimplementasikan bagian ServiceImplementation.


0

Bagi saya pesan ini:

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

berarti "dalam pengujian unit gawang saya di bagian atas, Anda harus menambahkan kacang itu secara manual seperti"

appContext.putBean(myClass);

0

Saya mengikuti semua langkah dan instruksi yang diikuti oleh OP di sini, menjaga ruang kosong di sekitar nama pengguna dan kata sandi (meskipun pegas menangani spasi putih di file properti), masih menghadap

could not find bean for ___Repository

(Anda antarmuka yang memperluas JPARepository)

ATAU setelah menambahkan @EnableJPARepository

could not find bean for EntityManagerFactory

saya menyelesaikannya dengan mengubah versi induk spring boot starter dari 2.3.2 ke 2.2.1 di 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>

dan menambahkan ketergantungan berikut

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

Saya tidak perlu menambahkan salah satu dari berikut ini, booting musim semi melakukannya sendiri

  1. @EnableJPAReposity - karena saya sudah memiliki semua kelas dengan paket root yang sama
  2. spring.data.jpa.repositories.enabled di application.properties
  3. spring.datasource.driverClassName = com.mysql.jdbc.Driver di properti aplikasi

0

Bagi siapa saja yang dibawa ke sini dengan googling pesan kesalahan kacang generik, tetapi yang sebenarnya mencoba menambahkan klien palsu ke aplikasi Spring Boot mereka melalui @FeignClientanotasi pada antarmuka klien Anda, tidak ada solusi di atas yang akan bekerja untuk Anda.

Untuk memperbaiki masalah, Anda perlu menambahkan @EnableFeignClientsanotasi ke kelas Application Anda, seperti:

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

Dengan cara ini, perbaikannya mirip dengan @EnableMongoRepositoriesperbaikan yang disebutkan di atas. Sangat disayangkan bahwa pesan kesalahan umum ini memerlukan perbaikan yang disesuaikan untuk setiap jenis keadaan ...


0

Dua jenis ketergantungan 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> 

Dua jenis repositori -

MongoRepository
ReactiveMongoRepository

Pastikan Anda menggunakan kombinasi yang tepat.


-1

Menggunakan ini memecahkan masalah saya.

@SpringBootApplication(scanBasePackages={"com.example.something", "com.example.application"})
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.