无法在 Kotlin 中创建 Spring 数据事件侦听器

Can't create Spring Data Event Listener in Kotlin

我试过像这样创建一个事件监听器:

@Bean
open fun beforeSaveEventApplicationListener(): ApplicationListener<BeforeSaveEvent>
{
   return ApplicationListener<BeforeSaveEvent>()
   {
       fun onApplicationEvent(event: BeforeSaveEvent)
       {
           //Do something with event
       }
   }
}

。 . .但它不会编译。指定泛型类型的地方,编译器returns:

Type argument expected

我做错了什么?

不确定您想要实现什么,但一个简单的解决方法是在 returning 语句中添加 object 关键字:

@Bean 
open fun beforeSaveEventApplicationListener(): ApplicationListener<BeforeSaveEvent> 
{
    return object : ApplicationListener<BeforeSaveEvent>()
    {
        override fun onApplicationEvent(event: BeforeSaveEvent)
        {
            //Do something with event
        }
    }
}

object 意味着您 return 是 class 的一个对象,而不是您的代码中的一个奇怪的东西。我还添加了 override 因为我怀疑 onApplicationEventApplicationListener 的方法,所以它必须被覆盖。

其实,如果你觉得只有一个这样的对象没问题,你可以直接使用object作为单例:

@Bean object beforeSaveEventApplicationListener: ApplicationListener<BeforeSaveEvent>() {
    override fun onApplicationEvent(event: BeforeSaveEvent) {
            //Do something with event
    }
}

问题是您可以使用一些可能的 BeforeSaveEvent classes。这里有一些模拟出来的 Spring classes 来告诉你区别(注意两个 BeforeSaveEvent 声明):

open class ApplicationEvent(source: Any): EventObject(source) {}

interface ApplicationListener<T: ApplicationEvent> {
    fun onApplicationEvent(event: T)
}

// the Spring Data Neo4j version requires a type
class BeforeSaveEvent<T>(source: Any, val entity: T): ApplicationEvent(source) {}

// the Spring data version does not
class BeforeSaveEvent(source: Any): ApplicationEvent(source) {}

因此,如果您编码为 Spring 数据版本,您的代码将是这样的:

open class Something {
    open fun beforeSaveEventApplicationListener(): ApplicationListener<BeforeSaveEvent> {
        return object : ApplicationListener<BeforeSaveEvent> {
            override fun onApplicationEvent(event: BeforeSaveEvent) {
                //Do something with event
            }
        }
    }
}

如果您编码为 Neo4j 版本(我认为您是,因为您的问题标签包括 spring-data-neo4j-4),您还必须指定实体类型参数:

class MyEntity {}

open class Something {
    open fun beforeSaveEventApplicationListener(): ApplicationListener<BeforeSaveEvent<MyEntity>> {
        return object : ApplicationListener<BeforeSaveEvent<MyEntity>> {
            override fun onApplicationEvent(event: BeforeSaveEvent<MyEntity>) {
                //Do something with event
            }
        }
    }
}

因此您可以准确地看到编译器要求的内容:

Please give me a type parameter for BeforeSaveEvent because it is really BeforeSaveEvent<T>

可能是您导入了错误的 class 而意味着另一个 BeforeSaveEvent 或者您导入了正确的 BeforeSaveEvent<T> 并且没有适应其实际的泛型类型参数需求。

此外,由于 ApplicationListener 是一个接口,您在使用后不希望 () 因为这意味着您正试图在接口上调用构造函数。

注意: 提供相关 classes 的声明签名有助于解决您的问题, 从 IDE 的角度来看(点击它找到您正在使用的 class,它可能不是您认为的那个)。