Pertimbangkan untuk mendefinisikan kacang berjenis 'paket' dalam konfigurasi Anda [Spring-Boot]

109

Saya mendapatkan kesalahan berikut:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method setApplicant in webService.controller.RequestController required a bean of type 'com.service.applicant.Applicant' that could not be found.


Action:

Consider defining a bean of type 'com.service.applicant.Applicant' in your configuration.

Saya belum pernah melihat kesalahan ini sebelumnya, tetapi aneh bahwa @Autowire tidak berfungsi. Berikut adalah struktur proyeknya:

Antarmuka Pemohon

public interface Applicant {

    TApplicant findBySSN(String ssn) throws ServletException;

    void deleteByssn(String ssn) throws ServletException;

    void createApplicant(TApplicant tApplicant) throws ServletException;

    void updateApplicant(TApplicant tApplicant) throws ServletException;

    List<TApplicant> getAllApplicants() throws ServletException;
}

ApplicantImpl

@Service
@Transactional
public class ApplicantImpl implements Applicant {

private static Log log = LogFactory.getLog(ApplicantImpl.class);

    private TApplicantRepository applicantRepo;

@Override
    public List<TApplicant> getAllApplicants() throws ServletException {

        List<TApplicant> applicantList = applicantRepo.findAll();

        return applicantList;
    }
}

Sekarang saya seharusnya bisa menjadi Pemohon Autowire dan dapat mengakses, namun dalam hal ini tidak berfungsi ketika saya memanggilnya di @RestController:

@RestController
public class RequestController extends LoggingAware {

    private Applicant applicant;

    @Autowired
    public void setApplicant(Applicant applicant){
        this.applicant = applicant;
    }

    @RequestMapping(value="/", method = RequestMethod.GET)
    public String helloWorld() {

        try {
            List<TApplicant> applicantList = applicant.getAllApplicants();

            for (TApplicant tApplicant : applicantList){
                System.out.println("Name: "+tApplicant.getIndivName()+" SSN "+tApplicant.getIndSsn());
            }

            return "home";
        }
        catch (ServletException e) {
            e.printStackTrace();
        }

        return "error";
    }

}

------------------------ UPDATE 1 -----------------------

saya tambahkan

@SpringBootApplication
@ComponentScan("module-service")
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

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

}

dan kesalahan hilang tetapi tidak ada yang terjadi. Namun ketika saya komentar segalanya berurusan dengan Applicantdalam RestControllersebelum menambahkan @ComponentScan()saya bisa mengembalikan string UI, dengan demikian berarti saya RestControllerbekerja, sekarang sedang dilewati. Aku jelek Whitelabel Error Pagesekarang

--------------------- UPDATE 2 --------------------------- ---

Saya menambahkan paket dasar kacang yang dikeluhkannya. Kesalahan membaca:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method setApplicantRepo in com.service.applicant.ApplicantImpl required a bean of type 'com.delivery.service.request.repository.TApplicantRepository' that could not be found.


Action:

Consider defining a bean of type 'com.delivery.request.request.repository.TApplicantRepository' in your configuration.

saya tambahkan @ComponentScan

@SpringBootApplication
@ComponentScan({"com.delivery.service","com.delivery.request"})
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

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

}

---------------------------- Perbarui 3 -------------------- -

menambahkan:

@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {

masih mengeluh tentang ApplicantImplkelas @Autowiressaya yang repo saya TApplicantRepositoryke dalamnya.

Mike3355
sumber
Di mana file konteks aplikasi Anda? Jika Anda tidak memilikinya, Anda harus mempertimbangkan untuk memberi Spring beberapa petunjuk dengan anotasi seperti @ComponentScan untuk membuat semua kacang tersedia.
Mario Santini
@MarioSantini silakan lihat pembaruan 1
Mike3355
Saya berasumsi setelah setiap pembaruan ada perubahan kesalahan? Jika memungkinkan, posting struktur proyek Anda, dan log kesalahan / stacktrace dalam setiap kasus .. Lebih baik mengetahui "Mengapa" kesalahan tersebut terjadi, daripada "sesuatu" membuat kesalahan itu hilang. Akan sangat membantu bagi orang lain yang menemukan masalah serupa juga.
Ameen.M

Jawaban:

201

Mungkin karena proyek tersebut telah dipecah menjadi beberapa modul.

@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {
Mike3355
sumber
5
Keren. Proyek saya dibagi dengan sejumlah modul. ComponentScan memecahkan masalah saya!
kholofelo Maloma
Anotasi ComponentScan menyelesaikan masalah saya tetapi @EnableAutoConfiguration tidak
jpl
Faktanya, EnableAutoConfiguration secara implisit mendefinisikan "paket pencarian" dasar untuk item tertentu dan menggunakan paket root juga memungkinkan anotasi ComponentScan digunakan tanpa perlu menentukan atribut basePackage. Dan anotasi @SpringBootApplication dapat digunakan jika kelas utama Anda ada dalam paket root
jpl
1
Solusi ini membantu saya mengatasi kesalahan ini di versi 2.0.4
manu muraleedharan
2
Ya, itu karena fakta bahwa proyek tersebut telah dipecah menjadi beberapa modul. @EntityScandan @EnableJpaRepositoriesdengan nama paket yang tepat berhasil untuk saya.
Adi Sivasankaran
52

Ada kemungkinan ...
Anda mungkin hilang @Service, @Repositorypenjelasan tentang kelas implementasi Anda masing-masing.

CodeWorld
sumber
2
Ini harus menjadi jawaban yang diterima, sederhana dan langsung ke sasaran. Terima kasih.
nightfury
1
Bekerja untuk saya. Terima kasih.
Okafor T Kosiso
1
Terima kasih, saya melewatkan anotasi
@Repositori
1
Ya ini harus menjadi jawabannya. Jawaban di atas hanya mengasumsikan bahwa pemindaian gagal, itu salah.
Sumit Badsara
48

Sepertinya kelas Pelamar Anda tidak dipindai. Secara default semua paket yang dimulai dengan root sebagai kelas tempat Anda meletakkan @SpringBootApplicationakan dipindai.

misalkan mainkelas Anda "WebServiceApplication" ada di " com.service.something", maka semua komponen yang berada di bawah " com.service.something" dipindai, dan " com.service.applicant" tidak akan dipindai.

Anda dapat merestrukturisasi paket Anda sehingga "WebServiceApplication" berada di bawah paket root dan semua komponen lainnya menjadi bagian dari paket root tersebut. Atau Anda dapat memasukkan @SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})dll sedemikian rupa sehingga "SEMUA" komponen dipindai dan diinisialisasi dalam wadah pegas.

Update berdasarkan komentar

Jika Anda memiliki beberapa modul yang dikelola oleh maven / gradle, semua kebutuhan pegas adalah paket untuk dipindai. Anda memberi tahu spring untuk memindai "com.module1" dan Anda memiliki modul lain yang memiliki nama paket root sebagai "com.module2", komponen tersebut tidak akan dipindai. Anda bahkan dapat memberi tahu spring untuk memindai "com" yang kemudian akan memindai semua komponen di " com.module1." dan " com.module2."

Ameen.M
sumber
Proyek saya adalah struktur modul yang berbeda. Misalnya layanan akan memiliki modulnya sendiri dan build.gradle. Mereka build.gradlenama modul ditambahkan ke dependenciesmodul dengan metode utama. Karena itu ketika Anda melihat @ComponentScan("module-service")itulah yang saya pikir akan berhasil. Namun di dalamnya module-serviceada satu paket. Jadi pertanyaan saya akan terlihat seperti apa? Apakah saya hanya memberi nama paket atau nama modul atau keduanya?
Mike3355
Tidak masalah jika paket tersebut termasuk dalam modul yang berbeda. Paket di mana komponen harus dipindai harus ditentukan ke pegas. Anda dapat memberikan semua nama paket "root" dari semua modul Anda di atribut "scanBasePackages" .. Dan semua "paket" yang harus disebutkan, bukan modul.
Ameen.M
Melakukan apa yang Anda katakan dan, kesalahan hilang tetapi hanya mengeluh tentang paket lain. Secara alami saya menambahkannya ke daftar tetapi tidak akan hilang. Saya menerapkannya seperti ini:@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
Mike3355
Saya baru saja melakukannya @SpringBootApplication(scanBasePackages= "com")dan mengeluh tentang repositori JPA. Terima kasih banyak. Saya tidak tahu spring akan memindai semua paket yang dimulai dengan "com" jika Anda melakukan hal di atas.
Mike3355
23

Pada dasarnya ini terjadi ketika Anda memiliki Aplikasi Kelas Anda di "paket lain". Sebagai contoh:

com.server
 - Applicacion.class (<--this class have @ComponentScan)
com.server.config
 - MongoConfig.class 
com.server.repository
 - UserRepository

Saya memecahkan masalah dengan ini di Application.class

@SpringBootApplication
@ComponentScan ({"com.server", "com.server.config"})
@EnableMongoRepositories ("com.server.repository") // this fix the problem

Cara lain yang kurang elegan adalah dengan: meletakkan semua kelas konfigurasi dalam paket yang sama.

Carlos Marcano
sumber
2
Faktanya, Anda tidak perlu menentukan @ComponentScandalam skenario di atas. Karena Anda Application.class(yang memiliki @SpringBootApplicationanotasi) ditempatkan di com.serveryang merupakan pula akar untuk kedua com.server.configserta com.server.repository.
Ameen.M
@ Ameen.M Itu pertanyaan persis saya, Mengapa masih belum bisa menyelesaikan dan mengapa itu memerlukan pemindaian eksplisit untuk menggunakan repo mongo @EnableMongoRepositories?
Karthikeyan
10

Dalam kasus saya, saya melakukan kesalahan besar. Saya memasang @Serviceantarmuka layanan.

Untuk memperbaikinya, saya @Servicemenerapkan file layanan dan itu berhasil untuk saya.

Mohammad Falahi
sumber
Sama untuk ku. Terima kasih
Manta
7

Jika kacang berada dalam paket yang sama dengan @Autowired, maka tidak akan pernah menimbulkan masalah seperti itu. Namun, kacang tidak dapat diakses dari paket yang berbeda secara default. Untuk memperbaiki masalah ini ikuti langkah-langkah berikut:

  1. Impor yang berikut di kelas utama Anda:
    import org.springframework.context.annotation.ComponentScan;
  2. tambahkan anotasi di atas kelas utama Anda:
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringExampleApplication.class, args);
    }
}
PANDI ASHWANI
sumber
5

Saya rasa Anda dapat membuatnya disederhanakan dengan menganotasi repositori Anda dengan @Repository, kemudian akan diaktifkan secara otomatis oleh Spring Framework.

Tushar Saha Chowdhury
sumber
4

Dalam kasus saya, kedua opsi ini berhasil.

  1. di //@ComponentScan ({"myapp", "myapp.resources","myapp.services"}) sertakan juga paket yang menyimpan Application.classdalam daftar, atau

  2. Cukup tambahkan @EnableAutoConfiguration; secara otomatis mengenali semua kacang pegas.

Sriharsha grv
sumber
3

Ini juga dapat terjadi jika Anda menggunakan Lombok dan Anda menambahkan bidang @RequiredArgsConstructordan @NonNulluntuk tetapi beberapa bidang Anda tidak akan dimasukkan ke dalam konstruktor. Ini hanya salah satu kemungkinan untuk mendapatkan kesalahan yang sama.

parameter 0 membutuhkan kacang jenis MissingBeanName yang tidak dapat ditemukan

Dalam kasus saya, kesalahan tersebut memberi tahu saya apa masalahnya pada Pengontrol, setelah menghapus @NonNullaplikasi dimulai dengan baik

Dawid Gorczyca
sumber
3

Saya menghadapi masalah yang familiar dalam proyek multi-modul Maven saya dengan Spring Boot 2. Masalahnya terkait dengan penamaan paket saya di sub modul Maven.

@SpringBootApplication menyertakan banyak komponen seperti - @ComponentScan, @EnableAutoConfiguration, jpa-repositories, json-serialization, dan sebagainya. Dan dia menempatkan @ComponentScan di paket luar angkasa com. *******. Bagian dari paket com. *******. Space harus sama untuk semua modul.

Untuk memperbaikinya:

  1. Anda harus mengganti nama semua paket modul. Kata lain yang harus Anda miliki di semua paket di semua modul Maven - bagian induk yang sama. Misalnya - com. *******. Space
  2. Anda juga harus memindahkan titik masuk Anda ke paket ini - com. *******. Space
alexis_druzik
sumber
2

Saya mencari jawaban secara online tetapi tampaknya tidak ada solusi yang tepat untuk kasus saya: Pada awalnya, semuanya berfungsi dengan baik sebagai berikut:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
}

Kemudian saya mencoba menambahkan peta untuk menyimpan sesuatu dan menjadi seperti ini:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
    Map<String, String> testMap;
}

Ledakan!

Description:

Parameter 4 of constructor in *.GroupService required a bean of type 'java.lang.String' that could not be found.


Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

Saya menghapus @AllArgsConstructor(onConstructor = @__(@Autowired))dan menambahkan @Autowireduntuk masing-masing repositorydan servicekecuali Map<String, String>. Ini hanya berfungsi seperti sebelumnya.

@Slf4j
@Service
public class SecurityGroupService {
    @Autowired
    private Repository repository;
    @Autowired
    private Service service;
    Map<String, String> testMap;
}

Semoga ini bisa membantu.

Dengarkan
sumber
2

Itu berhasil untuk saya setelah menambahkan anotasi di bawah ini dalam aplikasi:

@ComponentScan({"com.seic.deliveryautomation.mapper"})

Saya mendapatkan kesalahan di bawah ini:

"Parameter 1 konstruktor di membutuhkan kacang jenis mapper yang tidak dapat ditemukan:

Cintai Kumar
sumber
2

Anotasi @Configuration hanya akan menyelesaikan kesalahan

oludamilare olukotun
sumber
2

Anda juga akan mendapatkan kesalahan ini jika Anda tidak sengaja mendefinisikan kacang yang sama di dua kelas yang berbeda. Itu terjadi pada saya. Pesan kesalahan itu menyesatkan. Ketika saya menghapus kacang ekstra, masalah telah teratasi.

Ross Mills
sumber
1
@SpringBootApplication
@MapperScan("com.developer.project.mapper")

public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
pengembang07
sumber
1

Ini bisa terjadi jika kelas @Service ditandai sebagai abstrak.

Ariel
sumber
1

Jika ketergantungan kelas Anda dikelola oleh Spring maka masalah ini dapat terjadi jika kita lupa menambahkan konstruktor arg default / kosong di dalam kelas POJO kita.

Arif Khan
sumber
1

Ini mungkin membantu seseorang. Saya memiliki masalah yang sama, pesan kesalahan yang sama, semuanya sama. Saya mencoba solusi dari jawaban lain, tidak membantu sampai saya menyadari bahwa kacang yang saya gunakan memiliki nama yang sama dengan yang sebenarnya telah dipasangi otomatis. Itu terjadi di tengah-tengah refactor, jadi saya harus mengganti nama kelas, yang hasilnya positif. Bersulang

Staxx
sumber
1

Saya menghadapi masalah yang sama. Repositori Mongo DB diidentifikasi oleh Spring boot, tetapi itu tidak membuat Bean untuk antarmuka repositori yang memperluas repositori mongo.

Masalah dalam kasus saya adalah spesifikasi versi yang salah di maven pom untuk "musim semi + mangga". Saya telah mengubah id grup artefak dan semuanya bekerja seperti sulap. tidak perlu penjelasan karena sepatu bot musim semi menangani semuanya.

Selama penyelesaian masalah saya, saya mencari solusi di seluruh web dan menyadari bahwa masalah ini sebenarnya terkait dengan konfigurasi proyek, siapa pun yang menghadapi masalah ini harus terlebih dahulu memeriksa penyiapan proyek mereka dan mengaktifkan debug dari musim semi untuk mendapatkan detail lebih lanjut tentang kegagalan dan memperhatikan dengan cermat di mana tepatnya dalam prosesnya, pembuatan gagal.

pengguna13650952
sumber
0

Dalam kasus saya, kesalahan ini muncul karena impor saya salah, misalnya, menggunakan pegas, impor otomatis muncul:

import org.jvnet.hk2.annotations.Service;

tetapi saya membutuhkan:

import org.springframework.stereotype.Service;
Washington da Silva
sumber
0

Saya punya kasus di mana saya perlu menyuntikkan RestTemplate ke dalam kelas layanan. Namun, RestTemplate tidak dapat diambil oleh kelas layanan. Apa yang saya lakukan adalah membuat kelas pembungkus di bawah paket yang sama dengan aplikasi utama dan menandai pembungkusnya sebagai Komponen dan memasang otomatis komponen ini di kelas layanan. Masalah terpecahkan. berharap ini juga berhasil untuk Anda

pengguna11976602
sumber
0

Kesalahan saya adalah saya memasukkan:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

dari pada:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
pengguna1441323
sumber
0

Saya pikir, Anda kehilangan anotasi @Bean di RequestController Anda

Tambahkan Bean di file Anda, ini menyelesaikan masalah saya.
Saya mendapatkan solusi ini saat saya belajar Spring Boot dari tutorialspoint

private Applicant applicant;

@Bean 
public Applicant applicant() { 
    return new Applicant(); 
}
pengguna3709901
sumber
0

Menambahkan Data Spring Boot, ketergantungan JPA Starter memecahkan masalah untuk saya.

Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

Gradle

compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.2.6.RELEASE'

Atau Anda bisa langsung ke sini

Johny Thomas Kariath
sumber
Ini sebenarnya tidak berlaku dalam kasus ini. Ini meminta detail koneksi ke database (Gagal mengonfigurasi Sumber Data: atribut 'url' tidak ditentukan dan tidak ada sumber data tersemat yang dapat dikonfigurasi.). Dalam situasi di mana saya ingin menguji secara manual tanpa berinteraksi dengan database, ini tidak akan berhasil.
Thomas Okonkwo
0

Jika Anda menggunakan, interfaceAnda dapat memperluas CrudRepository<Applicant,Long>dengan @Repositorypenjelasan.

zawhtut.dll
sumber
0

Masalah juga dapat muncul ketika Anda menggunakan per contoh @EnableMongoRepositories(YOUR_MONGO_REPOSITORIES_PACKAGE)dan kemudian Anda mengganti nama paket atau memindahkannya ke tempat lain.

Sangat sering dihadapi dalam proyek maven multi-modul dan boot musim semi

redoff
sumber
0

Ada kemungkinan Anda mencoba @autowired sebuah antarmuka sebelum mengimplementasikan antarmuka tersebut.

contoh solusi:

    **HomeController.java**
    class HomeController{

      @Autowired
      UserService userService;
    .....
    }
----------------------------------------------------------------------
    **UserService.java** 
    public interface UserService {
        User findByUsername(String username);
    .....
    }
-----------------------------------------------------------------------
     **UserServiceImpl.java**
     @Service
     public class UserServiceImpl implements UserService{

         public User findByUsername(String username) {
           return userDao.findByUsername(username);
         }
        ....
      }

<i>This is not italic</i>, and [this is not a link](https://example.com)
biddut
sumber
0

Hapus konfigurasi jenis anotasi seperti @Service dari metode thread run.

@Service, @Component
Sandun Susantha
sumber
0

Coba konfigurasikan struktur proyek seperti yang diberikan di bawah ini:

Letakkan semua repo, layanan, paket di paket turunan dari paket utama:

package com.leisure.moviemax;  //Parent package
        
@SpringBootApplication
@PropertySource(value={"classpath:conf.properties"})
    
public class MoviemaxApplication implements CommandLineRunner {
        
package com.leisure.moviemax.repo; //child package

@Repository
public interface UsrRepository extends JpaRepository<UserEntity,String> {
Barani r
sumber
0

pengingat bahwa spring tidak memindai dunia, ia menggunakan pemindaian bertarget yang berarti semua yang ada di bawah paket tempat aplikasi springboot disimpan. oleh karena itu kesalahan ini "Pertimbangkan untuk mendefinisikan kacang jenis 'paket' dalam konfigurasi Anda [Spring-Boot]" mungkin muncul karena Anda memiliki antarmuka layanan dalam paket aplikasi springboot yang berbeda.

popcornw
sumber