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

Eka Rudianto
sumber

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
Eka Rudianto
sumber
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
76

Tambahkan @Servicedi service / UserService.java.

dzzxjl.dll
sumber
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
    })
lusuh
sumber
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.

Akash Yellappa
sumber
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.

Bhushan Karmarkar
sumber
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;!

Vitali Kuzmin
sumber
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
9

Anda harus menambahkan @Serviceanotasi untuk implementasi layanan Anda.

Ahmed AMMOURI
sumber
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 .

Dengarkan
sumber
5

Tambahkan @Component di kelas pengontrol Anda. Semoga ini berhasil

shubham bansal
sumber
3

Tambahkan @Repository di kelas dao Anda

contoh:

@Repository
public class DaoClassName implements IIntefaceDao {
}
sonOFAthena
sumber
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
Kashmir 54
sumber
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

Ahmad
sumber
2

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

Ashish Singh
sumber
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.

mumbasa
sumber
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 ...

RotS
sumber
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.

Łukasz Kotyński
sumber
1

Tambahkan @Repository di kelas dao Anda

    @Repository
    public interface UserDao extends CrudRepository<User, Long> {
         User findByUsername(String username);
         User findByEmail(String email);    
      }
biddut
sumber
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

duracell
sumber
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();
}
Anwar Sir
sumber
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.

benymor
sumber
0

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

Zain Elabidine
sumber
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.

Cyber
sumber
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);
rogerdpack
sumber
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
Shubham Debnath
sumber
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 ...

eriegz
sumber
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.

Akshay kharade
sumber
-1

Menggunakan ini memecahkan masalah saya.

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