11

फेंकता है मेरे पास स्प्रिंग बूट 0.5.0.M5 का उपयोग कर एक प्रोजेक्ट सेटअप है।स्प्रिंग बूट - पर्यावरण @Autowired NullPointerException

कॉन्फ़िगरेशन फ़ाइलों में से एक में मैं @Autowire Environment पर कोशिश कर रहा हूं लेकिन यह NullPointerException के साथ विफल रहता है।

यहाँ मैं अब तक है:

Application.java

JpaConfig.java जहाँ मैं @Autowire Environment

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages = "com.ui.persistence.repository") 
public class JpaConfig { 
    private static final String DATABASE_DRIVER = "db.driver"; 
    private static final String DATABASE_PASSWORD = "db.password"; 
    private static final String DATABASE_URL = "db.url"; 
    private static final String DATABASE_USERNAME = "db.username"; 
    private static final String HIBERNATE_DIALECT = "hibernate.dialect"; 
    private static final String HIBERNATE_SHOW_SQL = "hibernate.show_sql"; 
    private static final String ENTITYMANAGER_PACKAGES_TO_SCAN 
     = "entitymanager.packages.to.scan"; 

    @Autowired 
    private Environment env; 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(env.getProperty(DATABASE_DRIVER)); 
     dataSource.setUrl(env.getProperty(DATABASE_URL)); 
     dataSource.setUsername(env.getProperty(DATABASE_USERNAME)); 
     dataSource.setPassword(env.getProperty(DATABASE_PASSWORD)); 
     return dataSource; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean 
       = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setDataSource(dataSource()); 
     entityManagerFactoryBean.setPersistenceProviderClass(
       HibernatePersistence.class); 
     entityManagerFactoryBean.setPackagesToScan(
       env.getProperty(ENTITYMANAGER_PACKAGES_TO_SCAN)); 
     entityManagerFactoryBean.setJpaProperties(hibernateProperties()); 
     return entityManagerFactoryBean; 
    } 
} 

मैं लोड करने के लिए कोशिश कर रहा हूँ करने के लिए कोशिश कर रहा हूँ एक गुण फ़ाइल में कॉन्फ़िगर डेटाबेस गुण। हालांकि, Environment इंजेक्शन नहीं है और कोड NullPointerException के साथ विफल रहता है। मेरे पास एक्सएमएल फाइलों में कोई विन्यास नहीं है।

प्रॉपर्टी के लिए दायर मैं PropertySourcesPlaceholderConfigurer इस तरह से कॉन्फ़िगर किया है:

@Configuration 
@PropertySource("classpath:database.properties") 
public class PropertyConfig { 
    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 
} 

मैं @Autowired, @Resource और @Inject अदला-बदली की कोशिश की है, लेकिन अभी तक कुछ भी काम किया है। किसी भी मदद की सराहना करेंगे। धन्यवाद।

+0

आप स्टैक ट्रेस दिखा सकते हैं? इसके अलावा, 'पर्यावरण' प्रदान करने वाला कुछ भी है? मुझे लगता है कि आपको एक कक्षा की आवश्यकता है जिसमें एक विधि है जो '@ बीन' के साथ चिह्नित एक लौटाती है। साथ ही, आप पर्यावरण प्राप्त करने और उन्हें इस तरह से प्राप्त करने के बजाय अपनी संपत्तियों को सेट करने के लिए '@ Value' का उपयोग करने में सक्षम हो सकते हैं। – CodeChimp

+0

मैंने @ वैल्यू के साथ प्रयास किया, काम नहीं किया। स्टैक ट्रेस सिर्फ NullPointerException है क्योंकि चर सेट नहीं किए गए हैं। धन्यवाद। – imme

उत्तर

4

मेरा मानना ​​है कि वहाँ वसंत और EntityManagerFactory के साथ कुछ जीवन चक्र मुद्दे थे, और आप उन (4.0.0.RC1 में तय) की बेईमानी से गिर गए हैं हो सकता है - अगर आपकी @Configuration वर्ग सुपर जल्दी instantiated हो जाता है, इसके लिए पात्र नहीं हो सकता है autowiring। यदि मामला है तो आप शायद लॉग आउटपुट से बता सकते हैं।

बस दिलचस्पी की वजह से, आप जानते हैं कि कार्यक्षमता (आप के रूप में लंबे समय के रूप @ComponentScan कि पैकेज जहां अपने खजाने परिभाषित कर रहे हैं) अपने JpaConfig और PropertyConfig द्वारा प्रदान की पहले से ही presetn है बॉक्स से बाहर अगर आप @EnableAutoConfiguration का उपयोग करें? उदाहरण के लिए JPA sample in Spring Boot देखें।

+0

इसे बहुत जल्दी कहा जाता है, क्या मुझे इस मामले में गुणों को पढ़ने और सेट करने के लिए कोड लिखना होगा? मैंने उदाहरण को देखा कि यह hsqldb का उपयोग करता है। मैं MySQL पर हूं, मुझे विश्वास है कि मुझे डेटा यूआरएल कनेक्शन यूआरएल, उपयोगकर्ता नाम और ऐसे के साथ प्रदान करना होगा। उत्तर देने के लिए समय निकालने के लिए धन्यवाद। – imme

+0

स्प्रिंग बूट में 'डेटासोर्स' कॉन्फ़िगरेशन को बाहरी करने के लिए कुछ सम्मेलन हैं ([उदाहरण यहां] (https://github.com/spring-projects/spring-xd/blob/master/spring-xd-dirt/src/main/resources/ application.yml # L31)), इसलिए आपको इनमें से कोई भी करने की आवश्यकता नहीं है। यदि मैं आप थे तो मैं MySQL को आजमाने से पहले एच 2 या एचएसक्यूएलडीबी के साथ काम कर रहा हूं। –

+0

कूल, एक आकर्षण की तरह काम करता है (MySQL का उपयोग कर)! धन्यवाद डेव! – imme

16

हालांकि अपने विशिष्ट समस्या हल हो जाती है, यहाँ के मामले में वसंत के autowiring बहुत देर हो चुकी होता Environment पहुंचने का तरीका बताया।

चाल org.springframework.context.EnvironmentAware लागू करने के लिए है; वसंत तब पर्यावरण को setEnvironment() विधि से गुजरता है। यह वसंत 3.1 के बाद से काम करता है।

एक उदाहरण:

@Configuration 
@PropertySource("classpath:myProperties.properties") 
public class MyConfiguration implements EnvironmentAware { 

    private Environment environment; 

    @Override 
    public void setEnvironment(final Environment environment) { 
     this.environment = environment; 
    } 

    public void myMethod() { 
     final String myPropertyValue = environment.getProperty("myProperty"); 
     // ... 
    } 

} 

यह @Autowire या @Value के रूप में के रूप में सुंदर नहीं है, लेकिन यह कुछ स्थितियों में समाधान के रूप में काम करता है।

+2

मुझे एक अजीब स्थिति थी जहां कॉन्फ़िगरेशन के साथ एनोटेटेड कक्षा में दो बीन विधियां थीं। एक विधि ने डेटासोर्स बनाया और दूसरा एक PropertySourcesPlaceholderConfigurer जिसे मैंने प्रॉपर्टी फाइलों से प्रारंभ किया जो मैं ऑटोवायर पर्यावरण क्षेत्र में मानों के आधार पर स्थित हूं। यह ठीक काम करता है (कॉन्फ़िगरर प्रारंभ होने से पहले पर्यावरण शुरू किया गया था)। मैंने पर्यावरण क्षेत्र के साथ गुण विधि को दूसरे वर्ग में स्थानांतरित करने का निर्णय लिया और, एक बार मैंने ऐसा करने के बाद, कॉन्फ़िगरर बीन प्रारंभ होने पर पर्यावरण शून्य था। SetEnvironment() का उपयोग इस के आसपास काम किया। धन्यवाद! –

+1

धन्यवाद यह अच्छी तरह से काम किया – JamesC

0

मुझे स्प्रिंग बैच पर एक ही समस्या थी। लेखक पर्यावरण वर्ग को स्वचालित नहीं कर सकते क्योंकि कॉन्फ़िगरेशन क्लास को तुरंत चालू किया गया था। इसलिए मैंने पर्यावरण को तुरंत चालू करने के लिए सिंगलटन (पुरानी विधि) का एक प्रकार बनाया और मैं हर बार इसका उपयोग कर सकता था।

मैं इस कार्यान्वयन किया:

@Configuration 
@PropertySource(value = { "classpath:kid-batch.properties" }, ignoreResourceNotFound = false) 
public class BatchConfiguration implements EnvironmentAware { 

private static Environment env; 

public static String getProperty(String key) { 
    return env.getProperty(key); 
} 

@Override 
public void setEnvironment(Environment env) { 
    BatchConfiguration.env = env; 
} 

}

और यह काम करता है

संबंधित मुद्दे