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 Applicant
dalam RestController
sebelum menambahkan @ComponentScan()
saya bisa mengembalikan string UI
, dengan demikian berarti saya RestController
bekerja, sekarang sedang dilewati. Aku jelek Whitelabel Error Page
sekarang
--------------------- 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 ApplicantImpl
kelas @Autowires
saya yang repo saya TApplicantRepository
ke dalamnya.
sumber
Jawaban:
Mungkin karena proyek tersebut telah dipecah menjadi beberapa modul.
sumber
@EntityScan
dan@EnableJpaRepositories
dengan nama paket yang tepat berhasil untuk saya.Ada kemungkinan ...
Anda mungkin hilang
@Service
,@Repository
penjelasan tentang kelas implementasi Anda masing-masing.sumber
Sepertinya kelas Pelamar Anda tidak dipindai. Secara default semua paket yang dimulai dengan root sebagai kelas tempat Anda meletakkan
@SpringBootApplication
akan dipindai.misalkan
main
kelas 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.
"sumber
build.gradle
. Merekabuild.gradle
nama modul ditambahkan kedependencies
modul dengan metode utama. Karena itu ketika Anda melihat@ComponentScan("module-service")
itulah yang saya pikir akan berhasil. Namun di dalamnyamodule-service
ada satu paket. Jadi pertanyaan saya akan terlihat seperti apa? Apakah saya hanya memberi nama paket atau nama modul atau keduanya?@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
@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.Pada dasarnya ini terjadi ketika Anda memiliki Aplikasi Kelas Anda di "paket lain". Sebagai contoh:
Saya memecahkan masalah dengan ini di Application.class
Cara lain yang kurang elegan adalah dengan: meletakkan semua kelas konfigurasi dalam paket yang sama.
sumber
@ComponentScan
dalam skenario di atas. Karena AndaApplication.class
(yang memiliki@SpringBootApplication
anotasi) ditempatkan dicom.server
yang merupakan pula akar untuk keduacom.server.config
sertacom.server.repository
.@EnableMongoRepositories
?Dalam kasus saya, saya melakukan kesalahan besar. Saya memasang
@Service
antarmuka layanan.Untuk memperbaikinya, saya
@Service
menerapkan file layanan dan itu berhasil untuk saya.sumber
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:
import org.springframework.context.annotation.ComponentScan;
sumber
Saya rasa Anda dapat membuatnya disederhanakan dengan menganotasi repositori Anda dengan @Repository, kemudian akan diaktifkan secara otomatis oleh Spring Framework.
sumber
Dalam kasus saya, kedua opsi ini berhasil.
di
//@ComponentScan ({"myapp", "myapp.resources","myapp.services"})
sertakan juga paket yang menyimpanApplication.class
dalam daftar, atauCukup tambahkan
@EnableAutoConfiguration
; secara otomatis mengenali semua kacang pegas.sumber
Ini juga dapat terjadi jika Anda menggunakan Lombok dan Anda menambahkan bidang
@RequiredArgsConstructor
dan@NonNull
untuk tetapi beberapa bidang Anda tidak akan dimasukkan ke dalam konstruktor. Ini hanya salah satu kemungkinan untuk mendapatkan kesalahan yang sama.Dalam kasus saya, kesalahan tersebut memberi tahu saya apa masalahnya pada Pengontrol, setelah menghapus
@NonNull
aplikasi dimulai dengan baiksumber
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:
sumber
Saya mencari jawaban secara online tetapi tampaknya tidak ada solusi yang tepat untuk kasus saya: Pada awalnya, semuanya berfungsi dengan baik sebagai berikut:
Kemudian saya mencoba menambahkan peta untuk menyimpan sesuatu dan menjadi seperti ini:
Ledakan!
Saya menghapus
@AllArgsConstructor(onConstructor = @__(@Autowired))
dan menambahkan@Autowired
untuk masing-masingrepository
danservice
kecualiMap<String, String>
. Ini hanya berfungsi seperti sebelumnya.Semoga ini bisa membantu.
sumber
Itu berhasil untuk saya setelah menambahkan anotasi di bawah ini dalam aplikasi:
@ComponentScan({"com.seic.deliveryautomation.mapper"})
Saya mendapatkan kesalahan di bawah ini:
sumber
Anotasi @Configuration hanya akan menyelesaikan kesalahan
sumber
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.
sumber
sumber
Ini bisa terjadi jika kelas @Service ditandai sebagai abstrak.
sumber
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.
sumber
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
sumber
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.
sumber
Dalam kasus saya, kesalahan ini muncul karena impor saya salah, misalnya, menggunakan pegas, impor otomatis muncul:
tetapi saya membutuhkan:
sumber
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
sumber
Kesalahan saya adalah saya memasukkan:
dari pada:
sumber
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
sumber
Menambahkan Data Spring Boot, ketergantungan JPA Starter memecahkan masalah untuk saya.
Maven
Gradle
Atau Anda bisa langsung ke sini
sumber
Jika Anda menggunakan,
interface
Anda dapat memperluasCrudRepository<Applicant,Long>
dengan@Repository
penjelasan.sumber
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
sumber
Ada kemungkinan Anda mencoba @autowired sebuah antarmuka sebelum mengimplementasikan antarmuka tersebut.
contoh solusi:
sumber
Hapus konfigurasi jenis anotasi seperti @Service dari metode thread run.
sumber
Coba konfigurasikan struktur proyek seperti yang diberikan di bawah ini:
Letakkan semua repo, layanan, paket di paket turunan dari paket utama:
sumber
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.
sumber