java - @Service 中带有 Kotlin 的 Spring Boot @Autowired 始终为空

标签 java spring spring-mvc spring-boot kotlin

目前我尝试用 Kotlin 重写我的 Java Spring Boot 应用程序。我遇到了一个问题,在我所有使用 @Service 注释的类中,依赖注入(inject)都无法正常工作(所有实例都是 null)。这是一个例子:

@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;
    }

如果我在 Kotlin 中使用 @Component 注释组件,一切正常:

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

Google 为 Kotlin 和 @Autowired 提供了许多不同的方法,我尝试过,但都导致相同的 NullPointerException 我想知道 Kotlin 和 Java 之间的区别是什么以及如何解决这个问题?

最佳答案

我刚刚遇到了完全相同的问题 - 注入(inject)效果很好,但是在添加 @Transactional 注释后,所有 Autowiring 的字段都为空。

我的代码:

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

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

} 

这里的问题是 Kotlin 中的方法默认是 final 的,所以 Spring 无法为该类创建代理:

 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)
   }

} 

关于java - @Service 中带有 Kotlin 的 Spring Boot @Autowired 始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41298289/

相关文章:

java - 如何通过返回主方法然后输入第二个方法将两个并行数组从一种方法移动到另一种方法?

hibernate - Spring的异常转换机制没有启动

java - Spring data mongodb 查询skip() 的工作方式不正常。

java - Eclipse 使用冗余结果字段生成 HashCode

java - System.currentTimeMillis() 行为错误

java - Spring 安全 Java 配置

java - Spring WS - 在 STS 中一步一步(来自 WSDL)

java - 迁移 apache commons cookiePolicy 到 httpClient4.3 的 cookieSpec

java - 在 spring mvc 中更改 URL

java - Android slider 布局和 NullPointerException