स्प्रिंग बूट में @Repository एनोटेट इंटरफ़ेस को स्वतः-लोड नहीं किया जा सकता


80

मैं एक स्प्रिंग बूट एप्लिकेशन विकसित कर रहा हूं और मैं यहां एक मुद्दे पर चल रहा हूं। मैं @Repository एनोटेट इंटरफ़ेस इंजेक्ट करने की कोशिश कर रहा हूं और यह बिल्कुल काम नहीं करता है। मुझे यह त्रुटि मिल रही है

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springBootRunner': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.pharmacy.persistence.users.dao.UserEntityDao com.pharmacy.config.SpringBootRunner.userEntityDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pharmacy.persistence.users.dao.UserEntityDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
    at com.pharmacy.config.SpringBootRunner.main(SpringBootRunner.java:25)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.pharmacy.persistence.users.dao.UserEntityDao com.pharmacy.config.SpringBootRunner.userEntityDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pharmacy.persistence.users.dao.UserEntityDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
    ... 16 common frames omitted
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pharmacy.persistence.users.dao.UserEntityDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
    ... 18 common frames omitted

यहाँ मेरा कोड है:

मुख्य अनुप्रयोग वर्ग:

package com.pharmacy.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;


@SpringBootApplication
@ComponentScan("org.pharmacy")
public class SpringBootRunner {


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

इकाई वर्ग:

package com.pharmacy.persistence.users;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;



@Entity
public class UserEntity {

    @Id
    @GeneratedValue
    private Long id;
    @Column
    private String name;

}

रिपॉजिटरी इंटरफ़ेस:

package com.pharmacy.persistence.users.dao;

import com.pharmacy.persistence.users.UserEntity;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;


@Repository
public interface UserEntityDao extends CrudRepository<UserEntity,Long>{

}

नियंत्रक:

package com.pharmacy.controllers;

import com.pharmacy.persistence.users.UserEntity;
import com.pharmacy.persistence.users.dao.UserEntityDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class HomeController {


    @Autowired
    UserEntityDao userEntityDao;

    @RequestMapping(value = "/")
    public String hello() {
        userEntityDao.save(new UserEntity("ac"));
        return "Test";

    }
}

build.gradle

buildscript {
    ext {
        springBootVersion = '1.2.2.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'spring-boot'
mainClassName = "com.pharmacy.config.SpringBootRunner"
jar {
    baseName = 'demo'
    version = '0.0.1-SNAPSHOT'
}


repositories {
    mavenCentral()
}


dependencies {
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-ws")
    compile("postgresql:postgresql:9.0-801.jdbc4")

    testCompile("org.springframework.boot:spring-boot-starter-test")
}

आवेदन:

spring.view.prefix: /
spring.view.suffix: .html

spring.jpa.database=POSTGRESQL
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=update


spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=abc123

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

संपादित करें: मैंने अपना कोड बदल दिया जैसा कि ऊपर देखने के लिए सुझाया गया है, और जब मैं अपने @Repository इंटरफ़ेस को किसी अन्य घटक में इंजेक्ट कर रहा हूं तो मुझे वह त्रुटि नहीं मिल रही है। हालाँकि, मुझे अब एक समस्या है - मेरे घटक को पुनर्प्राप्त नहीं किया जा सकता है (मैंने डिबगिंग का उपयोग किया है)। मैं गलत कर रहा हूँ तो वसंत मेरे घटक नहीं मिल सकता है?


और क्या होगा अगर आप एक अन्य घटक बनाते हैं और अपने 'UserEntityDao userEntityDao' को इसमें इंजेक्ट करते हैं? (यह भी एक संकेत है: कभी भी सीधे खेतों पर निर्भरता को इंजेक्ट न करें, उचित तर्कों के साथ निर्माणकर्ता का उपयोग करें और उस पर @ ऑटोवेड / @ इंजेक्ट करें)।
रफाल जी।

जवाबों:


168

जब रिपॉजिटरी पैकेज @SpringBootApplication/ के लिए अलग है @EnableAutoConfiguration, के आधार पैकेज को @EnableJpaRepositoriesस्पष्ट रूप से परिभाषित करने की आवश्यकता है।

@EnableJpaRepositories("com.pharmacy.persistence.users.dao")स्प्रिंगबूटरनर में जोड़ने का प्रयास करें


4
थोड़े पुराने, लेकिन अनुप्रयोग वर्ग पर @EnableJpaRepositories जोड़कर चाल चली।
हेटम जाबेर

4
स्ट्रेंज डॉक्स कहते हैं, "डिफ़ॉल्ट रूप से, स्प्रिंग बूट JPA रिपॉजिटरी सपोर्ट को सक्षम करेगा और पैकेज (और इसके सबपेकेज) में दिखेगा जहां @SpringBootApplication स्थित है।" spring.io/guides/gs/accessing-data-jpa
magulla

4
@ मगुल्ला: ओपी के @SpringBootApplicationपैकेज में स्थित है com.pharmacy.config, जबकि में @EnableJpaRepositoriesस्थित हैcom.pharmacy.persistence.users.dao
Hang321

28
मेरा भी यही मुद्दा था। एक बार जब मैंने अपनी रिपॉजिटरी के लिए एक पैकेज निर्दिष्ट किया, तो मुझे एक और त्रुटि मिली Entity is not a managed type। किसी और के पास यह समस्या होने के लिए, आपको एनोटेशन भी जोड़ना होगा@EntityScan("com.package.dtos")
c.dunlap

2
MongoDB रिपॉजिटरी के लिए@EnableMongoRepositories("...")
Omid

41

मेरे पास वही मुद्दे थे जो रिपोजिटरी को नहीं मिल रहे थे। इसलिए मैंने जो कुछ किया वह सब कुछ 1 पैकेज में ले जाना था। और इसका मतलब यह था कि मेरे कोड में कुछ भी गलत नहीं था। मैंने रिपोज और एंटिटीज़ को एक और पैकेज में स्थानांतरित कर दिया और निम्नलिखित स्प्रिंगपेप्लिकेशन वर्ग में जोड़ दिया।

@EnableJpaRepositories("com...jpa")
@EntityScan("com...jpa")

उसके बाद, मैंने सेवा (इंटरफ़ेस और कार्यान्वयन) को एक और पैकेज में स्थानांतरित कर दिया और निम्नलिखित स्प्रिंगपेप्लिमेशन वर्ग में जोड़ दिया।

@ComponentScan("com...service")

इससे मेरे मसले हल हो गए।


3
यह वास्तव में उत्तर होना चाहिए क्योंकि इसने संपूर्ण मुद्दे को हल किया। जैसा कि यह not mapped typeसिर्फ जोड़ने के बाद त्रुटि देता है@EnableJpaRepositories
आदित्य पेशव

25

इस प्रकार की समस्या का एक और कारण है जिसे मैं साझा करना चाहूंगा, क्योंकि मैं कुछ समय के लिए इस समस्या में संघर्ष करता हूं और मुझे एसओ पर कोई जवाब नहीं मिला।

एक भंडार में जैसे:

@Repository
public interface UserEntityDao extends CrudRepository<UserEntity, Long>{

}

अपने इकाई तो UserEntity नहीं है@Entity वर्ग पर टिप्पणी है, तो आप एक ही गलती होगी।

यह त्रुटि इस मामले के लिए भ्रमित करने वाली है, क्योंकि आप स्प्रिंग के बारे में समस्या को हल करने की कोशिश पर ध्यान केंद्रित नहीं करते हैं, लेकिन समस्या इकाई है। और यदि आप अपने रिपॉजिटरी का परीक्षण करने की कोशिश कर रहे हैं, तो यह उत्तर आपकी मदद कर सकता है।


1
बैंग! काम किया! धन्यवाद।
स्पार्कस्पाइडर

2
अच्छा चिल्लाओ! धन्यवाद। मेरे लिए मैं रेडिस रेपो का उपयोग कर रहा था, इसलिए रेडिश हैश को परिभाषित करते हुए इसे ठीक किया। जैसे @RedisHash (LanguageMapping.KEY_NAME)
thettoy

16

ऐसा लगता है कि आपका @ComponentScanएनोटेशन ठीक से सेट नहीं किया गया है। प्रयत्न :

@ComponentScan(basePackages = {"com.pharmacy"})

वास्तव में आपको घटक स्कैन की आवश्यकता नहीं है यदि आपके पास संरचना के शीर्ष पर आपका मुख्य वर्ग है, उदाहरण के लिए सीधे com.pharmacyपैकेज के तहत ।

इसके अलावा, आप दोनों की जरूरत नहीं है

@SpringBootApplication
@EnableAutoConfiguration

@SpringBootApplicationएनोटेशन शामिल @EnableAutoConfigurationडिफ़ॉल्ट रूप से।


वास्तव में @ComponentScan("com.pharmacy")करना चाहिए।
ci_

"वास्तव में आपको घटक स्कैन की आवश्यकता नहीं है यदि आपके पास संरचना के शीर्ष पर आपका मुख्य वर्ग है" मेरे लिए काम किया!
एडम

14

मेरे पास एक समान मुद्दा था जहां मैं NoSuchBeanDefinitionExceptionस्प्रिंग बूट (मूल रूप से सीआरयूडी रिपॉजिटरी पर काम करते हुए) प्राप्त कर रहा था, मुझे नीचे एनोटेशन मुख्य वर्ग पर रखना था:

@SpringBootApplication   
@EnableAutoConfiguration
@ComponentScan(basePackages={"<base package name>"})
@EnableJpaRepositories(basePackages="<repository package name>")
@EnableTransactionManagement
@EntityScan(basePackages="<entity package name>")

इसके अलावा, सुनिश्चित करें कि आपके पास @Componentकार्यान्वयन पर एनोटेशन हैं।


7

स्प्रिंगबूट में, JpaRepository डिफ़ॉल्ट रूप से ऑटो-सक्षम नहीं है। आपको स्पष्ट रूप से जोड़ना होगा

@EnableJpaRepositories("packages")
@EntityScan("packages")

एक ही मुद्दा मैं सामना कर रहा था, मेरे पास एक लाइब्रेरी प्रोजेक्ट में रेपो और एंटिटी थी, जिसे एक एप्लीकेशन प्रोजेक्ट में एक निर्भरता के रूप में जोड़ा गया था। App.java में इन्हें स्पष्ट रूप से सक्षम करने की आवश्यकता है।
फ्रांसिस राज

3

यहाँ गलती है: जैसा कि किसी ने पहले कहा था, आप अवयव में com.pharmacy के org.pharmacy का उपयोग कर रहे हैं

    package **com**.pharmacy.config;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ComponentScan;


    @SpringBootApplication
    @ComponentScan("**org**.pharmacy")
    public class SpringBootRunner {

3

उपरोक्त उत्तरों पर विस्तार करने के लिए, आप वास्तव में अपने EnableJPARepositories टैग में एक से अधिक पैकेज जोड़ सकते हैं, ताकि आप केवल रिपॉजिटरी पैकेज को निर्दिष्ट करने के बाद "ऑब्जेक्ट मैप्ड" त्रुटि में न चलें।

@SpringBootApplication
@EnableJpaRepositories(basePackages = {"com.test.model", "com.test.repository"})
public class SpringBootApplication{

}

3

आप गलत पैकेज स्कैन कर रहे हैं:

@ComponentScan("**org**.pharmacy")

जहां यह होना चाहिए:

@ComponentScan("**com**.pharmacy")

चूंकि आपके पैकेज के नाम कॉम से शुरू होते हैं, न कि ओआरजी से।


3
@SpringBootApplication(scanBasePackages=,<youur package name>)
@EnableJpaRepositories(<you jpa repo package>)
@EntityScan(<your entity package>)

Entity class like below 
@Entity
@Table(name="USER")
public class User {

    @Id
    @GeneratedValue

2
हालांकि यह कोड प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, इससे वास्तव में आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद मिलेगी, और संभवत: अधिक वोटों का परिणाम होगा। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है। कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें और संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं। रिव्यू से
डबल बीप

2

मेरे पास स्प्रिंग डेटा MongoDB के साथ एक समान मुद्दा था: मुझे पैकेज पथ को जोड़ना था @EnableMongoRepositories


1

मुझे एक समान समस्या थी लेकिन एक अलग कारण के साथ:

मेरे मामले में समस्या यह थी कि रिपॉजिटरी को परिभाषित करने वाले इंटरफ़ेस में

public interface ItemRepository extends Repository {..}

मैं टेम्पलेट के प्रकारों को छोड़ रहा था। उन्हें सही सेट करना:

public interface ItemRepository extends Repository<Item,Long> {..}

चाल चली।


बहुत बढ़िया। केवल समाधान जिसने मुझे समस्या को ठीक करने में मदद की;
सिमरन कौर

1

मुझे इस विषय में कुछ समस्याएं भी थीं। आपको यह सुनिश्चित करना होगा कि आप नीचे दिए गए उदाहरण में स्प्रिंग बूट रनर वर्ग में संकुल को परिभाषित करें:

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan({"controller", "service"})
@EntityScan("entity")
@EnableJpaRepositories("repository")
public class Application {

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

आशा है कि ये आपकी मदद करेगा!


1

में @ComponentScan("org.pharmacy"), आप org.pharmacyपैकेज घोषित कर रहे हैं । लेकिन com.pharmacyपैकेज में आपके घटक ।


1

यदि आप इस समस्या का सामना कर रहे हैं जब यूनिट परीक्षण के साथ @DataJpaTestतो आपको नीचे समाधान मिल जाएगा।

स्प्रिंग बूट के लिए @Repositoryसेम को इनिशियलाइज़ नहीं करते हैं @DataJpaTest। तो उन्हें उपलब्ध करने के लिए नीचे दिए गए दो में से एक को आज़माएं:

प्रथम

@SpringBootTestइसके बजाय उपयोग करें । लेकिन यह संपूर्ण एप्लिकेशन संदर्भ को बूट करेगा।

दूसरा (बेहतर समाधान)

नीचे दिए गए विशिष्ट रिपॉजिटरी को आप की तरह आयात करें

@DataJpaTest
@Import(MyRepository.class)
public class MyRepositoryTest {

@Autowired
private MyRepository myRepository;

1

यह उस पैकेज के साथ किया जा सकता है जो आपके पास है। मुझे एक समान समस्या थी:

Description:
Field userRepo in com.App.AppApplication required a bean of type 'repository.UserRepository' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)

क्रिया:

repository.UserRepositoryअपने विन्यास में ' ' प्रकार की एक बीन को परिभाषित करने पर विचार करें। "

मानकीकृत नामकरण सम्मेलन के साथ एक रिपॉजिटरी फ़ाइलों को एक पैकेज में रखा गया:

e.g. com.app.Todo (for main domain files)

तथा

com.app.Todo.repository (for repository files)

इस तरह, वसंत जानता है कि रिपॉजिटरी की तलाश में कहां जाना है, बाकी चीजें वास्तव में तेजी से भ्रमित करती हैं। :)

उम्मीद है की यह मदद करेगा।


0

सुनिश्चित करें कि @Serviceया @Componentजो रिपॉजिटरी को ऑटो-वायर करने की कोशिश कर रहा है वह आपके समान निर्देशिका में नहीं है SpringApplication.class। सुनिश्चित करें कि यह सबफ़ोल्डर की तरह है service/


0

कभी-कभी मेरे पास भी यही मुद्दे होते हैं जब मैं लवनोक एनोटेशन प्रोसेसर की निर्भरता को मावेन कॉन्फ़िगरेशन में जोड़ना भूल जाता हूं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.