我的目标是在所有命令处理程序的handle
方法上编织一些自定义方面。
我的自定义方面:
@Aspect
@Component
class EventProcessor @Autowired()(private val eventRepository: EventRepository) {
@Before("execution(* com.mypackage.*.application.commands.*.*(..))")
def listen() {
DomainEventPublisher.instance().subscribe(new DomainEventSubscriber[Event] {
def handleEvent(domainEvent: Event) {
eventRepository.save(domainEvent)
}
def subscribedToEventType = {
classOf[Event]
}
})
}
}
commandHandler
的一个例子:
trait CommentBlog {
def handle(command: MyCommand): ValidationNel[Failure, Unit]
}
在运行时编译自定义方面时,整个工作非常有用。 对于生产,我希望它在编译时编织,所以我用一个很棒的plugin来实现它。
但是,运行时出现此错误导致NoAspectBoundException
:
java.lang.NoSuchMethodError: .....EventProcessor: method <init>()V not found
这个方法init究竟是什么?可能是根本原因?
答案 0 :(得分:1)
我刚刚发现了这些东西:)
当@Landei提升时,找不到默认构造函数,因为它没有定义! 在斯卡拉:
class EventProcessor @Autowired()(private val eventRepository: EventRepository) {
创建一个接受EventRepository
的一个arg构造函数。
所以我的解决方案是:
@Aspect
class EventProcessor {
@Before("execution(* com.mypackage.*.application.commands.*.*(..))")
def listen() {
DomainEventPublisher.instance().subscribe(new DomainEventSubscriber[Event] {
def handleEvent(domainEvent: Event) {
val eventRepository = SpringContext.ctx.getBean("eventRepository", classOf[EventRepository])
eventRepository.save(domainEvent)
}
def subscribedToEventType = {
classOf[Event]
}
})
}
}