无法在 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
因为我怀疑 onApplicationEvent
是 ApplicationListener
的方法,所以它必须被覆盖。
其实,如果你觉得只有一个这样的对象没问题,你可以直接使用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,它可能不是您认为的那个)。
我试过像这样创建一个事件监听器:
@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
因为我怀疑 onApplicationEvent
是 ApplicationListener
的方法,所以它必须被覆盖。
其实,如果你觉得只有一个这样的对象没问题,你可以直接使用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 reallyBeforeSaveEvent<T>
可能是您导入了错误的 class 而意味着另一个 BeforeSaveEvent
或者您导入了正确的 BeforeSaveEvent<T>
并且没有适应其实际的泛型类型参数需求。
此外,由于 ApplicationListener
是一个接口,您在使用后不希望 ()
因为这意味着您正试图在接口上调用构造函数。
注意: 提供相关 classes 的声明签名有助于解决您的问题, 从 IDE 的角度来看(点击它找到您正在使用的 class,它可能不是您认为的那个)。