未调用实体侦听器
Entity listener not called
我有以下实体和关联的侦听器
@Entity
@EntityListeners(InjuryListener::class)
class Injury(val description: String,
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE) val id: Long = 0)
@Singleton
class InjuryListener : PreDeleteEventListener {
@PreRemove
fun preRemove(injury: Injury) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onPreDelete(event: PreDeleteEvent?): Boolean {
val injury = event?.entity as Injury
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
然而,当我删除一个 Injury 时,我的 InjuryListener 上的两个方法都没有被调用。关于为什么会这样的任何线索?
只要您在 micronaut 世界中,大部分 "magic" 都是在编译时完成的。 micronaut-data 的一个主要声明是不存在运行时元模型。
这实际上意味着,您的实体上没有 EntityListener
注释。
在 micronaut 世界中,您应该使用 DataInterceptor
来实现所需的功能。
正如 Ilya Dyoshin 所写,@EntityListener
和 @PreRemove
未在 Micronaut 数据中使用。但是你可以通过AOP技术来解决。
首先使用您需要的预删除逻辑创建您自己的拦截器:
@Singleton
class InjuryPreDeleteInterceptor : MethodInterceptor<Injury, Boolean> {
override fun intercept(context: MethodInvocationContext<Injury, Boolean>): Boolean {
val injury = context.parameterValues[0] as Injury
if (injury.someFlag) {
// do not delete
} else {
// delete
context.proceed()
}
return true
}
}
然后创建将触发 InjuryPreDeleteInterceptor
:
的注解
@MustBeDocumented
@Retention(RUNTIME)
@Target(AnnotationTarget.FUNCTION)
@Around
@Type(InjuryPreDeleteInterceptor::class)
annotation class VisitInjuryDelete
并将之前创建的@VisitInjuryDelete
注解注解的delete()
方法签名添加到InjuryRepository
接口中:
@VisitInjuryDelete
override fun delete(Injury entity)
您可以在此处找到有关 Micronaut 中 AOP 的更多信息:https://docs.micronaut.io/latest/guide/aop.html
我有以下实体和关联的侦听器
@Entity
@EntityListeners(InjuryListener::class)
class Injury(val description: String,
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE) val id: Long = 0)
@Singleton
class InjuryListener : PreDeleteEventListener {
@PreRemove
fun preRemove(injury: Injury) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onPreDelete(event: PreDeleteEvent?): Boolean {
val injury = event?.entity as Injury
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
然而,当我删除一个 Injury 时,我的 InjuryListener 上的两个方法都没有被调用。关于为什么会这样的任何线索?
只要您在 micronaut 世界中,大部分 "magic" 都是在编译时完成的。 micronaut-data 的一个主要声明是不存在运行时元模型。
这实际上意味着,您的实体上没有 EntityListener
注释。
在 micronaut 世界中,您应该使用 DataInterceptor
来实现所需的功能。
正如 Ilya Dyoshin 所写,@EntityListener
和 @PreRemove
未在 Micronaut 数据中使用。但是你可以通过AOP技术来解决。
首先使用您需要的预删除逻辑创建您自己的拦截器:
@Singleton
class InjuryPreDeleteInterceptor : MethodInterceptor<Injury, Boolean> {
override fun intercept(context: MethodInvocationContext<Injury, Boolean>): Boolean {
val injury = context.parameterValues[0] as Injury
if (injury.someFlag) {
// do not delete
} else {
// delete
context.proceed()
}
return true
}
}
然后创建将触发 InjuryPreDeleteInterceptor
:
@MustBeDocumented
@Retention(RUNTIME)
@Target(AnnotationTarget.FUNCTION)
@Around
@Type(InjuryPreDeleteInterceptor::class)
annotation class VisitInjuryDelete
并将之前创建的@VisitInjuryDelete
注解注解的delete()
方法签名添加到InjuryRepository
接口中:
@VisitInjuryDelete
override fun delete(Injury entity)
您可以在此处找到有关 Micronaut 中 AOP 的更多信息:https://docs.micronaut.io/latest/guide/aop.html