我正在使用SecurityListener来侦听身份验证事件。
class ProductSecurityEventListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {
def eventService;
void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) {
def user = event.getAuthentication().getPrincipal();
def secUser = SecUser.findByUsername(user.username)
eventService.logEventLogin(secUser);
}
我在resources.groovy
中定义了我的监听器beanbeans = {
productSecurityEventListener(ProductSecurityEventListener);
}
我在config.groovy
中启用它grails.plugins.springsecurity.useSecurityEventListener = true
我一直在eventservice.logEventLogin上获得一个空指针
java.lang.NullPointerException: Cannot invoke method logEventLogin() on null object
我调试,我可以看到事件触发和调用事件方法。我不能为我的生活弄清楚为什么没有注入eventService。
这是我的服务
class EventService {
def logEventLogin(SecUser secUser) {
event event = new Event(eventType: EventEnum.LOGIN, secUser: secUser, eventDate: new Date());
event.save();
}
欢迎任何想法或提示?
答案 0 :(得分:4)
作为Igor方法的替代方案,您可以为您的bean启用自动装配,因此您需要添加的任何未来依赖项(例如,如果您将来发现需要def grailsApplication
)也将自动连接:< / p>
beans = {
productSecurityEventListener(ProductSecurityEventListener) { bean ->
bean.autowire = 'byName'
}
}
答案 1 :(得分:2)
您必须设置eventService
属性:
beans = {
productSecurityEventListener(ProductSecurityEventListener) {
eventService = ref('eventService')
}
}