2016-12-23 66 views
6

Şu anda Java Spring Boot Uygulamamı Kotlin ile tekrar yazmaya çalışıyorum. Tüm sınıflarımda @Service ile açıklamalı olan bağımlılık enjeksiyonunun düzgün çalışmadığı bir sorunla karşılaştım (tüm örnekler null). İşte bir örnek: Java aynı yapmakSpring Boot @Otowired with Kotlin in @Service her zaman sıfır

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

sorunsuz çalışır:

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

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

Ben Kotlin her şeyde @Component ile bileşen açıklama ise çalışıyor:

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

Google'ı Kotlin ve denediğim @Autowired için birçok farklı yaklaşım sağlandı ama hepsi aynı NullPointerException ile sonuçlandı Kotlin ile Java arasındaki farkın ne olduğunu ve bunu nasıl düzeltebileceğimi bilmek isterim.

+0

Val'i var olarak değiştirmeyi denediniz mi? –

+0

[Nex Pointer Özel Durumunun Bahar Proxy Sınıfı ve Kotlin] 'in olası kopyası (http://stackoverflow.com/questions/37431817/null-pointer-exception-in-spring-proxy-class-and-kotlin) – miensol

+0

Evet ikisini de denedi. – Deutro

cevap

4

Hangi Bahar Önyükleme sürümünü kullanıyorsunuz? 1.4 Spring Boot, Spring Framework 4.3'ü temel aldığından ve o zamandan beri, @Autowired no'lu ek açıklama olmadan kurucu enjeksiyonunu kullanabilmeniz gerekir. Bunu denedin mi?

Böyle bakmak ve benim için çalışıyor olacaktır:

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

    // your class members 

} 
+1

Süper köpek :) – davidxxx

+0

Merhaba, bir '' varsayılan kurucu bulunamadı 've aynı zamanda özellikleri yapmayan olmadan bunu yapmak için bir yolu var mı -yapabilmek? *** (FYI Bazı parametrelerim depolar) *** – jasperagrante

+0

Sorunumu zaten çözdüm. "Varsayılan kurucu yok" veya @Outowired zaten bulunanlar için. Yapıcınızın varsayılan değerler olmadığından emin olun. – jasperagrante

2

Sadece aynı sorunu çarptı - enjeksiyon iyi çalıştı, ama @Transactional ek açıklama ekledikten sonra tüm autowired alanlar boş.

Kodum:

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

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

} 
Buradaki sorun Bahar sınıf için vekil oluşturamadığında böylece yöntemleri, KOTLIN varsayılan olarak nihai olmasıdır

:

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

"Açılım"

Sabit kod:

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

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

} 
yöntem sorunu giderir
+0

Kotlin, bu sınıfları açmak için bir derleme eklentisine sahiptir: https://kotlinlang.org/docs/reference/compiler-plugins.html –