'फील्ड को एक प्रकार की बीन की आवश्यकता होती है जो नहीं मिल पाती।' मोंगोडब का उपयोग करते हुए त्रुटि वसंत आरामदायक एपीआई


104

इसलिए मैं सप्ताह के जोड़ों में स्प्रिंग सीख रहा हूं, इस ट्यूटोरियल का अनुसरण कर रहा हूं

एक उत्साही वेब सेवा का निर्माण

जब तक मैंने इसे मोंगोडब में एकीकृत करने की कोशिश नहीं की तब तक सब ठीक था। इसलिए मैं इस ट्यूटोरियल का अनुसरण करता हूं।

MongoDB के साथ डेटा एक्सेस करना

लेकिन मेरा अभ्यास आंशिक रूप से अभी भी पहले वाले का उपयोग कर रहा है। तो मेरी परियोजना निर्देशिका संरचना इस तरह है।

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

यह मेरा मॉडल / User.java फ़ाइल है

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

यह मेरी बाकी / UsersController.java फ़ाइल है

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

यह मेरी सेवा / UserService.java फ़ाइल है

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

मैं उन्हें संकलित कर सकता हूं (मैं संकलन का उपयोग इसलिए कर रहा हूं क्योंकि मैं ट्यूटोरियल का अनुसरण कर रहा हूं), लेकिन जब मैं जार फाइल चलाता हूं तो यह त्रुटि फेंक रहा था।


लागू करने के लिए शुरू की गई


विवरण:

Main.java.rest.UserController में फ़ील्ड उपयोगकर्ता सेवा को 'main.java.service.UserService' प्रकार का एक बीन चाहिए जो नहीं मिला।

क्रिया:

अपने विन्यास में 'main.java.service.UserService' की बीन को परिभाषित करने पर विचार करें।

मुझे यकीन नहीं है कि क्या गलत है मैं चारों ओर घूमना शुरू करता हूं और पाया कि मुझे Beans.xmlफ़ाइल को शामिल करने और इसमें उपयोगकर्ता सेवा को पंजीकृत करने की आवश्यकता है। मैंने ऐसा किया लेकिन यह काम नहीं कर रहा है। मैं वास्तव में इसके लिए नया हूं इसलिए मुझे वास्तव में इस पर कोई सुराग नहीं है कि क्या हो रहा है।

जवाबों:


162

उसे हल कर लिया। इसलिए डिफ़ॉल्ट रूप से, @SpringBootApplicationघोषणा के अंतर्गत आने वाले सभी पैकेज स्कैन किए जाएंगे।

मेरे मुख्य वर्ग को मान लिया गया है ExampleApplicationकि @SpringBootApplicationअंदर घोषित किया गया है com.example.something, तो सभी घटक जो नीचे गिर गए हैं com.example.something, स्कैन किए गए हैं, जबकि स्कैन com.example.applicantनहीं किए जाएंगे।

तो, इस प्रश्न के आधार पर इसे करने के दो तरीके हैं । उपयोग

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

इस तरह, एप्लिकेशन सभी निर्दिष्ट घटकों को स्कैन करेगा, लेकिन मुझे लगता है कि अगर स्केल बड़ा हो रहा था तो क्या होगा?

इसलिए मैं अपने पैकेज के पुनर्गठन के द्वारा दूसरे दृष्टिकोण का उपयोग करता हूं और यह काम कर गया! अब मेरा पैकेज स्ट्रक्चर इस तरह का हो गया।

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

वास्तव में बहुत कुछ नहीं बदला, मैंने सिर्फ पैकेजों और कक्षाओं के कुछ नाम बदल दिए @GuoJing
Eka Rudianto

@ekaRudianto एक टाइपो है। कोई खोलने के {लिएscanBasePackages= "com.example.something","com.example.application"
brk

मेरे पास भी यही मुद्दा था और मुझे लगा कि मेरे पैकेज का ढांचा उचित क्रम में नहीं है। मैंने उन्हें इस तरह पुनर्व्यवस्थित किया और यह अब ठीक काम कर रहा है।
विमुक्ति सिन्थ


21

मेरी भी यही त्रुटि थी:

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

और मेरे पैकेजों का निर्माण उसी तरह किया गया जैसा कि स्वीकृत उत्तर में बताया गया है। मैंने इस तरह से मुख्य वर्ग में EnableMongoRepositories एनोटेशन जोड़कर अपना मुद्दा तय किया:

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

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

यदि आपको कई जोड़ने की आवश्यकता है तो कर्ली ब्रेसिज़ न भूलें:

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

14

मुझे एक ही समस्या का सामना करना पड़ा और मुझे बस इतना करना पड़ा कि आवेदन को सेवा, डाओ और डोमेन पैकेजों से एक स्तर अधिक पैकेज में रखा जाए।


12

यह धागा अभी पुराना है लेकिन मैं अपना उत्तर पोस्ट कर रहा हूं, जो दूसरों के लिए उपयोगी हो सकता है।

मेरी भी यही समस्या थी। यह पता चला कि अन्य मॉड्यूल में समान नाम वाला एक अन्य वर्ग है। मैंने उस वर्ग का नाम बदल दिया और इस मुद्दे को हल कर दिया।


10

ऑटो-इंपोर्ट की वजह से बहुत समय बिताया। Intellij Idea कुछ के बजाय @Serviceसे आयातित !import org.jvnet.hk2.annotations.Service;import org.springframework.stereotype.Service;


क्या आप अपना उत्तर अपडेट कर सकते हैं और समझा सकते हैं कि आप क्या कर रहे हैं। अग्रिम में बहुत धन्यवाद
MZaragoza

3
आपको मेरे उत्तर से क्या समझ में नहीं आया? मुझे प्रश्न में वही त्रुटि मिली, जो प्रोजेक्ट को चलाने की कोशिश कर रहा था। ऐसा इसलिए था क्योंकि मैंने Serviceगलत लाइब्रेरी से आयात किया है।
विटाली कुज़मिन

@VitaliKuzmin अभी भी आपके उत्तर में स्पष्टता नहीं है। आपका उत्तर सही हो सकता है और हो सकता है कि यह आपके लिए काम करे लेकिन जिस तरह से आपने यहां प्रस्तुत किया है वह भ्रमित करने वाला है और पाठक के अनुकूल नहीं है
मैनडेयर

3
@ मैनडेयर मुझे लगता है कि मेरी पहली टिप्पणी आपके जवाब के साथ-साथ आपकी टिप्पणी का भी जवाब देती है।
विटाली कुजमिन

+ 1 इस उत्तर को, क्योंकि मैंने एक आयात त्रुटि भी की थी! : 0 मेरे मॉडल के import javax.persistence.Table;बजाय import org.springframework.data.relational.core.mapping.Table;। smh ने इस सेम त्रुटि को डिबग करने में 5hrs खो दिए।
कल्पज अग्रवाल

9

आपको @Serviceअपनी सेवा के कार्यान्वयन में एनोटेशन जोड़ना होगा ।


6

आम तौर पर हम इस समस्या को दो पहलुओं में हल कर सकते हैं:

  1. उचित टिप्पणी के लिए इस्तेमाल किया जाना चाहिए वसंत बूट स्कैनिंग सेम , जैसे @Component;
  2. स्कैनिंग पथ कक्षाओं बस के रूप में अन्य सभी ऊपर उल्लेख शामिल होंगे।

वैसे, @Component, @Repository, @Service, और @Controller के बीच अंतर के लिए बहुत अच्छी व्याख्या है ।



3

@Repository को आप dao class में जोड़ें

उदाहरण:

@Repository
public class DaoClassName implements IIntefaceDao {
}

2

सभी @ एनोटेशन के उपयोग से मेरी समस्या ठीक हो गई। (हां, मैं स्प्रिंग में नया हूं) यदि आप एक सेवा वर्ग @Service जोड़ रहे हैं, और @Controller और @Repitoryitory के लिए भी उपयोग कर रहे हैं।

तब App.java पर इस एनोटेशन ने इस मुद्दे को ठीक कर दिया (मैं JPA + हाइबरनेट का उपयोग कर रहा हूं)

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

पैकेज पेड़:

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

मेरे पास एक ही मुद्दा है, @EnableMongoRepositories ("intopthree.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);
    }

}

और मेरा रिपॉजिटरी है:

package in.topthree.util;

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

public interface StudentMongo extends MongoRepository<Student, Integer> {

    public Student findByUrl(String url);
}

अब इसका काम कर रहा है


2

मेरी भी यही समस्या थी। मेरी गलती यह थी कि मैंने सेवा इंटरफ़ेस पर @ सेवा का उपयोग किया था। ServiceSmpl वर्ग में @Service एनोटेशन लागू किया जाना चाहिए।


2

मैं एक ही समस्या थी मैंने नियंत्रक से @Autowired एनोटेशन को हटा दिया। यदि आपकी रिपॉजिटरी एक वर्ग है तो रिपॉजिटरी का उपयोग करने के लिए ऑटोवेटेड एनोटेशन की आवश्यकता होती है लेकिन जब यह एक इंटरफ़ेस होता है तो आपको मेरे अनुभव से @Autowired एनोटेशन जोड़ने की आवश्यकता नहीं होती है।


1

मेरे लक्ष्य फ़ोल्डर में मेरे मैपर कार्यान्वयन कक्षाएं हटा दी गई थीं, इसलिए मेरे मैपर इंटरफेसों में अब कोई कार्यान्वयन कक्षाएं नहीं थीं। इस प्रकार मुझे वही त्रुटि मिलीField *** required a bean of type ***Mapper that could not be found.

मैं बस maven के साथ मेरे mappers कार्यान्वयन को पुनर्जीवित करना था, और परियोजना को ताज़ा करें ...


1

मैंगो रिपॉजिटरी के साथ स्प्रिंग वेबफ्लक्स का उपयोग करते हुए मदद की तलाश में मैं इस पोस्ट पर आया हूं।

मेरी त्रुटि स्वामी के समान थी

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

जैसा कि मैं स्प्रिंग एमवीसी के साथ काम कर रहा था, मैं इस त्रुटि से हैरान था।

क्योंकि सहायता प्राप्त करना इतना स्पष्ट नहीं था कि मैं इस प्रश्न का उत्तर दे रहा हूं क्योंकि यह किसी तरह से संबंधित है और खोज परिणामों में यह प्रश्न अधिक है।

पहली बात यह है कि आपको इस बात को याद रखना चाहिए कि उत्तर के रूप में क्या उल्लेख किया गया है - पैकेज पदानुक्रम।

दूसरी महत्वपूर्ण बात यह है कि यदि आप वेबफ्लक्स का उपयोग करते हैं तो आपको कुछ अलग पैकेज का उपयोग करने की आवश्यकता होती है जब MongoDB के लिए स्प्रिंग एमवीसी जैसे का उपयोग करना चाहिए

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

अंत में -reactive के साथ ।


1

अपने डाओ क्लास में @Repository जोड़ें

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

@Repository को जोड़ने की आवश्यकता नहीं है यदि आप पहले से ही CrudRepository
Karen Goh

1

यदि आप स्प्रिंग बूट का उपयोग करते हैं तो आपको भरोसेमंद के रूप में स्प्रिंग-बूट-स्टार्टर-डेटा-जपा आयात करना होगा


1

बीन बनाने और उसे इंजेक्ट करने के लिए वसंत के क्रम में वर्ग को अपने संदर्भ में @ कम्पोनेट, @ सेवा, @ रिपोजिटरी आदि के साथ चिह्नित किया जाना चाहिए।

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

ऐसा तब हो सकता है जब दो फलियों के नाम समान हों।

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

एक सेम नाम retrofitServiceपहली बार बनाया गया है, और यह प्रकार है GoogleAPI, फिर एक GithubAPIbecauce द्वारा कवर किया गया है वे दोनों एक retrofitService()विधि द्वारा बनाई गई हैं । अब जब आप @Autowiredएक GoogleAPIआप की तरह एक संदेश मिलेगाField googleAPI in com.example.GoogleService required a bean of type 'com.example.rest.GoogleAPI' that could not be found.


0

मेरे मामले में मैंने मॉडल, नियंत्रक, सेवा पैकेजों के समान स्तर के साथ सिर्फ एक पैकेज (com.example.start) में क्लास MyprojectApplication रखा है।


0

मुझे पता है कि यह पुराना है, लेकिन मेरे 5 सेंट जोड़ना चाहते हैं।

मैंने इसे लागू करने के साथ सेवा को अलग करने के लिए एक फ़ोल्डर संरचना में इस्तेमाल किया .serviceऔर .service.implकिया। ServiceImplementation टुकड़ा लागू करना भूल जाते हैं।


0

मेरे लिए यह संदेश:

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

मतलब "शीर्ष पर मेरे विकेट यूनिट टेस्ट में आपको उस सेम को मैन्युअल रूप से जोड़ना होगा"

appContext.putBean(myClass);

0

मैंने यहाँ ओपी के बाद सभी चरणों और निर्देशों का पालन किया, यूज़रनेम और पासवर्ड के आसपास खाली जगह की देखभाल की (भले ही वसंत संपत्तियों की फ़ाइल में व्हाट्सएप का ख्याल रखता है), अभी भी या तो सामना कर रहा था

could not find bean for ___Repository

(आप इंटरफ़ेस जो JPARepository का विस्तार करता है)

या @EnableJPARepository जोड़ने के बाद

could not find bean for EntityManagerFactory

मैंने इसे pom.xml में 2.3.2 से 2.2.1 तक स्प्रिंग बूट स्टार्टर पैरेंट वर्जन को बदलकर हल किया

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

और निम्नलिखित निर्भरता को जोड़ना

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

मुझे निम्न में से किसी को जोड़ने की आवश्यकता नहीं थी, स्प्रिंग बूट यह स्वयं करता है

  1. @EnableJPAReposity - चूंकि मेरे पास पहले से ही एक ही रूट पैकेज वाला सभी वर्ग था
  2. spring.data.jpa.repositories.en Application.properties में सक्षम
  3. spring.datasource.driverClassName = com.mysql.jdbc.Driver आवेदन गुणों में

0

जेनेरिक बीन एरर मैसेज को गुगली करके यहां लाया गया था, लेकिन जो वास्तव में आपके क्लाइंट इंटरफ़ेस पर एनोटेशन के माध्यम से अपने स्प्रिंग बूट एप्लिकेशन में एक फ़ाइनेंट क्लाइंट जोड़ने की कोशिश कर रहा है @FeignClient, उपरोक्त समाधानों में से कोई भी आपके लिए काम नहीं करेगा।

समस्या को ठीक करने के लिए, आपको @EnableFeignClientsएनोटेशन को अपने एप्लिकेशन वर्ग में जोड़ना होगा , जैसे:

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

इस तरह, @EnableMongoRepositoriesफिक्स ऊपर उल्लिखित फिक्स के समान है । यह शर्म की बात है कि इस सामान्य त्रुटि संदेश के लिए हर प्रकार की परिस्थिति के लिए इस तरह के एक निरंतर निर्धारण की आवश्यकता है ...


0

मूंगो निर्भरता के दो प्रकार -

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

दो प्रकार के रिपोजिटरी -

MongoRepository
ReactiveMongoRepository

सुनिश्चित करें कि आप सही संयोजन का उपयोग कर रहे हैं।


-1

इसके उपयोग से मेरी समस्या हल हो गई।

@SpringBootApplication(scanBasePackages={"com.example.something", "com.example.application"})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.