2014-11-13 8 views
8

में ऑटोवायर मोंगो रिपोजिटरी मैं अपनी सेवा कक्षा में मोंगो रिपोजिटरी को ऑटोवायर करना चाहता हूं, और मैं ऐसा करने में सक्षम नहीं हूं। मैं जावा कॉन्फ़िगरेशन का उपयोग कर रहा हूं।स्प्रिंग एमवीसी

@Controller 
public class TestController { 

    @Autowired 
    private TestService service; 

मेरा मुख्य जावा config:

@Service 
public class TestService { 

    @Autowired 
    private UserRepository repository; 

    public void save(User user) { 
     repository.save(user); 
    } 
} 

यह मेरा नियंत्रक का हिस्सा है जो सेवा का उपयोग करता है:

@Repository 
public interface UserRepository extends MongoRepository<User, String> { 

    public User findByFirstName(String firstName); 
    public List<User> findByLastName(String lastName); 

} 

इस सेवा जो UserRepository का उपयोग करता है: यह मेरा भंडार वर्ग है वर्ग इस तरह दिखता है:

@Configuration 
@EnableWebMvc 
@EnableMongoRepositories 
@Import({MjurAppConfig.class, MongoConfiguration.class}) 
@ComponentScan({"prv.makro.mjur.controller"}) 
public class MjurWebAppConfig extends WebMvcConfigurerAdapter { 

MjurAppConfig:

@Configuration 
@ComponentScan({"prv.makro.mjur.dao", "prv.makro.mjur.repository"}) 
public class MjurAppConfig { 

    @Bean 
    public User getUser() { 
     return new User(); 
    } 

    @Bean 
    public TestService getTestService() { 
     return new TestService(); 
    } 
} 

और मोंगो config:

@Configuration 
public class MongoConfiguration { 

    @Bean 
    public MongoFactoryBean mongo() { 
     MongoFactoryBean mongo = new MongoFactoryBean(); 
     mongo.setHost("localhost"); 
     mongo.setPort(27017); 
     return mongo; 
    } 

    @Bean 
    public MongoTemplate mongoTemplate() throws Exception{ 
     return new MongoTemplate(mongo().getObject(),"mjur"); 
    } 
} 

अपवाद:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private prv.makro.mjur.repository.UserRepository 
prv.makro.mjur.service.impl.FirstService.repository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [prv.makro.mjur.repository.UserRepository] 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)} 

मैं इस समस्या के लिए समाधान के लिए खोज रहा था, लेकिन मैं कुछ भी नहीं मिला। आईएमओ घटक स्कैन को भंडार मिलना चाहिए और इसे वसंत संदर्भ में बांधना चाहिए। अफसोस की बात है कि यह इस तरह काम नहीं कर रहा है।

उत्तर

13

ठीक है, समस्या @EnableMongoRepositories एनोटेशन के साथ थी।

जब मैं पैकेज का नाम शामिल किया है यह शरीर है करने के लिए (इसलिए यह की तरह लग रहा था: ({ "prv.makro.mjur.repository"}) @EnableMongoRepositories) मैं अपने UserRepository autowire को

+0

वही समस्या! धन्यवाद! – Enrichman

0

(टिप्पणियों के बाद और पोस्ट कोड का परिवर्तन) संपादित करें

इसका कारण यह है स्प्रिंग वेब अनुप्रयोग 2 संदर्भों है क्या हो रहा है: 1 जड़ संदर्भ है और एक और एक वेब संदर्भ (एक आप से रजिस्टर है @EnableWebMvc एनोटेशन)।

कृपया निम्न कार्य करें:

1) अपने MjurWebAppConfig से @Import एनोटेशन निकालें - याद इस अपने वेब संदर्भ है। 2) MjurAppConfig config अनिवार्य रूप से की तरह लग रही में @Import जोड़ें:

@Configuration 
@Import({MongoConfiguration.class}) 
@ComponentScan({"prv.makro.mjur.dao", "prv.makro.mjur.repository"}) 
public class MjurAppConfig { 
//.. 

ये चरण आपके सेवा सेम के अंदर दिखाई अपने autowired डीएओ सेम बनाना चाहिए।


संपादित करने से पहले:

मुझे यकीन है अपने TestService सेम पैकेज prv.makro.mjur.service घटक स्कैन एनोटेशन द्वारा पहचानने किया जा रहा है:

@ComponentScan({"prv.makro.mjur.controller"}) 

दूसरे शब्दों में @ComponentScan@Autowired निर्भरता रजिस्टर करने के लिए अपने TestService नहीं देख सकते हैं ।

यकीन TestService अपने घटक स्कैन द्वारा और इसके बाद के संस्करण धारणा यदि आप के तहत दृश्यमान है:

@ComponentScan({"prv.makro.mjur"}) 

यह काम करना चाहिए।

+0

आप सही हैं, लेकिन MjurAppConfig में मैं @Bean एनोटेशन का उपयोग कर टेस्ट सेवा को परिभाषित किया है। वैसे भी - मैंने उस पैकेज को घटक स्कैन एनोटेशन में जोड़ा और यह उसी त्रुटि को फेंकता है –

+0

मुझे लगता है कि त्रुटि हो सकती है क्योंकि UserRepository एक इंटरफ़ेस है, और रिपोजिटरी एनोटेशन कार्यान्वयन कक्षा पर होना चाहिए। हालांकि अगर मैं इस इंटरफ़ेस को कार्यान्वित कर दूंगा, तो मुझे सहेजने या ढूंढने जैसी सभी विधियों को कार्यान्वित करना होगा जैसे –

+0

मेरा उत्तर देखें - मैंने आपके अपडेट के बाद प्रारंभिक अनुभाग जोड़ा है – dimitrisli

1
  1. बनाएं सक्षम था @NoRepositoryBean एनोटेशन के साथ आपका भंडार इंटरफ़ेस।
@NoRepositoryBean 
public interface MyRepository<T, ID extends Serializable> extends MongoRepository<T, ID> { 

} 
  1. अपने भंडार कार्यान्वयन बनाएं
public class MyRepositoryImpl<T, ID extends Serializable> 
    extends SimpleMongoRepository<T, ID> { 

    public PermissableRepositoryImpl(
     final MongoEntityInformation<T, ID> metadata, 
     final MongoOperations mongoOperations 
    ) { 

     super(metadata, mongoOperations); 
    } 
} 
  1. अपने उचित विन्यास या आवेदन वर्ग के लिए @EnableMongoRepository टिप्पणी जोड़ें ।
@ComponentScan(basePackages = {"com.company"}) 
@EnableMongoRepositories(repositoryBaseClass = MyRepositoryImpl.class) 
@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

    public static void main(final String[] args) { 

     SpringApplication.run(Application.class, args); 
    } 

    @Override 
    protected final SpringApplicationBuilder configure(final SpringApplicationBuilder applicationBuilder) { 

     return applicationBuilder.sources(Application.class); 
    } 
}