2016-12-23 9 views
6

वर्तमान में मैं कोटलिन के साथ अपने जावा स्प्रिंग बूट एप्लिकेशन को फिर से लिखने का प्रयास करता हूं। मुझे एक समस्या का सामना करना पड़ा जो मेरी सभी कक्षाओं में @Service के साथ एनोटेटेड है, निर्भरता इंजेक्शन सही ढंग से काम नहीं कर रहा है (सभी उदाहरण null हैं)। यहाँ एक उदाहरण है:स्प्रिंग बूट @ @Service में कोटलिन के साथ आउटपुट हमेशा शून्य

@Service 
@Transactional 
open class UserServiceController @Autowired constructor(val dsl: DSLContext, val teamService: TeamService) { 
    //dsl and teamService are null in all methods 
} 

जावा में एक ही कर बिना किसी समस्या के काम करता है:

@Service 
@Transactional 
public class UserServiceController 
{ 
    private DSLContext dsl; 
    private TeamService teamService; 

    @Autowired 
    public UserServiceController(DSLContext dsl, 
          TeamService teamService) 
    { 
     this.dsl = dsl; 
     this.teamService = teamService; 
    } 

अगर मैं Kotlin हर चीज में @Component साथ घटक व्याख्या ठीक काम करता है:

@Component 
open class UserServiceController @Autowired constructor(val dsl: DSLContext, val teamService: TeamService) { 
    //dsl and teamService are injected properly 
} 

गूगल कोटलिन और @Autowired के लिए कई अलग-अलग दृष्टिकोण प्रदान किए जो मैंने कोशिश की लेकिन सभी के परिणामस्वरूप NullPointerException मैं जानना चाहता हूं कि कोटलिन और जावा के बीच क्या अंतर है और मैं इसे कैसे ठीक कर सकता हूं?

+0

क्या आपने वैल को वैर बदलने की कोशिश की है? –

+0

[स्प्रिंग प्रॉक्सी क्लास और कोटलिन में नल पॉइंटर अपवाद] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/37431817/null-pointer-exception-in-spring-proxy-class-and-kotlin) – miensol

+0

हाँ मैं पहले से ही दोनों की कोशिश की। – Deutro

उत्तर

4

आप किस वसंत बूट संस्करण का उपयोग करते हैं? चूंकि 1.4 स्प्रिंग बूट स्प्रिंग फ्रेमवर्क 4.3 पर आधारित है और तब से आप @Autowired एनोटेशन के बिना कन्स्ट्रक्टर इंजेक्शन का उपयोग करने में सक्षम होना चाहिए। क्या आपने कोशिश की है?

वह ऐसा दिखाई और मेरे लिए काम करता होगा:

@Service 
class UserServiceController(val dsl: DSLContext, val teamService: TeamService) { 

    // your class members 

} 
+1

सुपर कुत्ते के बजाय 'जेनेरिक एप्प्लिकेशन कॉन्टेक्स्ट' का उपयोग कर रहे हों :) – davidxxx

+0

हाय, 'कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं मिला' और गुणों को नलाने के बिना ऐसा करने का कोई तरीका है -योग्य? *** (एफवाईआई मेरे कुछ पैरामीटर रिपोजिटरी हैं) *** – jasperagrante

+0

मैंने पहले ही अपनी समस्या हल कर दी है। उन लोगों के लिए जिन्हें 'कोई डिफ़ॉल्ट कन्स्ट्रक्टर' नहीं मिल रहा है या @Autowired पहले ही मिल चुका है। सुनिश्चित करें कि आपके कन्स्ट्रक्टर के पास डिफ़ॉल्ट मान नहीं हैं। – jasperagrante

2

मैं बस ठीक उसी मुद्दा टकरा - इंजेक्शन अच्छी तरह से काम किया, लेकिन @Transactional एनोटेशन जोड़ने के बाद सभी autowired क्षेत्रों अशक्त हैं।

मेरे कोड:

@Service 
@Transactional 
open class MyDAO(val jdbcTemplate: JdbcTemplate) { 

    fun update(sql: String): Int { 
     return jdbcTemplate.update(sql) 
    } 

} 

समस्या है कि यहाँ के तरीकों, Kotlin में डिफ़ॉल्ट रूप से अंतिम होते हैं तो वसंत वर्ग के लिए प्रॉक्सी बनाने में असमर्थ है:

o.s.aop.framework.CglibAopProxy: Unable to proxy method [public final int org.mycompany.MyDAO.update(... 

"खोलना"

फिक्स्ड कोड:

@Service 
@Transactional 
open class MyDAO(val jdbcTemplate: JdbcTemplate) { 

    open fun update(sql: String): Int { 
     return jdbcTemplate.update(sql) 
    } 

} 
विधि समस्या ठीक होती है
+0

कोटलिन के पास इन कक्षाओं को खोलने के लिए एक बिल्ड प्लगइन है: https://kotlinlang.org/docs/reference/compiler-plugins.html –

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