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.
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.xml
mencari-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.
{
untukscanBasePackages= "com.example.something","com.example.application"
Tambahkan
@Service
di service / UserService.java.sumber
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 })
sumber
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.
sumber
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.
sumber
Menghabiskan banyak waktu karena impor otomatis. Ide Intellij entah mengapa diimpor
@Service
dariimport org.jvnet.hk2.annotations.Service;
alih-alihimport org.springframework.stereotype.Service;
!sumber
Service
dari perpustakaan yang salah.import javax.persistence.Table;
bukannyaimport org.springframework.data.relational.core.mapping.Table;
di model saya. smh kehilangan 5 jam dalam men-debug kesalahan kacang ini.Anda harus menambahkan
@Service
anotasi untuk implementasi layanan Anda.sumber
Biasanya kita dapat menyelesaikan masalah ini dalam dua aspek:
@Component
;Ngomong-ngomong, ada penjelasan yang sangat bagus untuk perbedaan antara @Component, @Repository, @Service, dan @Controller .
sumber
Tambahkan @Component di kelas pengontrol Anda. Semoga ini berhasil
sumber
Tambahkan @Repository di kelas dao Anda
contoh:
@Repository public class DaoClassName implements IIntefaceDao { }
sumber
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
sumber
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
sumber
Saya memiliki masalah yang sama. Kesalahan saya adalah saya menggunakan anotasi @Service di Service Interface. Anotasi @Service harus diterapkan ke kelas ServiceImpl.
sumber
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.
sumber
Kelas implementasi Mapper saya di folder target saya telah dihapus, jadi antarmuka Mapper saya tidak memiliki kelas implementasi lagi. Jadi saya mendapat kesalahan yang sama
Field *** required a bean of type ***Mapper that could not be found.
Saya hanya perlu meregenerasi implementasi pembuat peta saya dengan maven, dan menyegarkan proyek ...
sumber
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.
sumber
Tambahkan @Repository di kelas dao Anda
@Repository public interface UserDao extends CrudRepository<User, Long> { User findByUsername(String username); User findByEmail(String email); }
sumber
Anda harus mengimpor spring-boot-starter-data-jpa sebagai dependeny jika Anda menggunakan spring boot
sumber
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(); }
sumber
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
retrofitService
pertama kali dibuat, dan tipenya adalahGoogleAPI
, kemudian ditutup olehGithubAPI
karena keduanya dibuat dengan sebuahretrofitService()
metode. Sekarang ketika Anda@Autowired
seorangGoogleAPI
Anda akan mendapatkan pesan sepertiField googleAPI in com.example.GoogleService required a bean of type 'com.example.rest.GoogleAPI' that could not be found.
sumber
Dalam kasus saya, saya baru saja meletakkan Kelas MyprojectApplication dalam sebuah paket (com.example.start) dengan tingkat model, pengontrol, paket layanan yang sama.
sumber
Saya tahu ini sudah tua, tetapi ingin menambahkan 5 sen saya.
Saya menggunakan
.service
dan.service.impl
dalam struktur folder untuk memisahkan layanan dengan implementasinya. Lupakan untuk mengimplementasikan bagian ServiceImplementation.sumber
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);
sumber
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
sumber
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
@FeignClient
anotasi pada antarmuka klien Anda, tidak ada solusi di atas yang akan bekerja untuk Anda.Untuk memperbaiki masalah, Anda perlu menambahkan
@EnableFeignClients
anotasi ke kelas Application Anda, seperti:@SpringBootApplication // ... (other pre-existing annotations) ... @EnableFeignClients // <------- THE IMPORTANT ONE public class Application {
Dengan cara ini, perbaikannya mirip dengan
@EnableMongoRepositories
perbaikan yang disebutkan di atas. Sangat disayangkan bahwa pesan kesalahan umum ini memerlukan perbaikan yang disesuaikan untuk setiap jenis keadaan ...sumber
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 -
Pastikan Anda menggunakan kombinasi yang tepat.
sumber
Menggunakan ini memecahkan masalah saya.
@SpringBootApplication(scanBasePackages={"com.example.something", "com.example.application"})
sumber