2016-12-23 31 views
6

目前,我尝试重写与科特林我的Java春天启动的应用。我遇到了一个问题,在我所有的类被标注为@Service依赖注入工作不正常的(所有实例都null)。这里有一个例子:春季启动@Autowired与科特林在@Service总是空

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

做同样在Java中工作没有任何问题:

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

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

如果我在科特林一切与@Component注释组件正常工作:

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

谷歌提供了许多不同的方法对科特林和@Autowired,我试过,但都导致同一NullPointerException 我想知道Kotlin和Java有什么区别,以及我如何解决这个问题?

+0

您是否尝试将val更改为var? –

+0

的可能的复制[空指针异常在Spring代理类和科特林](http://stackoverflow.com/questions/37431817/null-pointer-exception-in-spring-proxy-class-and-kotlin) – miensol

+0

是的,我已经两个都试过。 – Deutro

回答

4

你使用哪种春引导版本?由于1.4 Spring Boot基于Spring Framework 4.3,因此您应该完全可以使用构造函数注入,而不需要任何@Autowired注释。你尝试过吗?

它看起来像这一点,对我的作品:

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

    // your class members 

} 
+1

超级狗:) – davidxxx

+0

嗨,有没有办法做到这一点没有得到一个'没有默认构造函数found'也通过不使性能空-能够? ***(仅供参考一些我的参数是存储库)*** – jasperagrante

+0

我已经解决了我的问题。对于那些正在获取“无默认构造函数”或者已经找到@Autowired的人。确保你的构造函数没有默认值。 – jasperagrante

2

我只是碰到了完全一样的问题 - 注射效果不错,但加@Transactional注解后,所有的自动连接字段为空。

我的代码:

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

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

} 

这里的问题是,这些方法都是final默认情况下科特林,所以春天是无法为类中创建代理:

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

Kotlin有一个构建插件来打开这些类:https://kotlinlang.org/docs/reference/compiler-plugins.html –