无法在我的Security LIstener中调用服务

时间:2013-09-02 11:25:27

标签: grails

我正在使用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

中定义了我的监听器bean
beans = {
    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();
    }

欢迎任何想法或提示?

2 个答案:

答案 0 :(得分:4)

作为Igor方法的替代方案,您可以为您的bean启用自动装配,因此您需要添加的任何未来依赖项(例如,如果您将来发现需要def grailsApplication)也将自动连接:< / p>

beans = {
    productSecurityEventListener(ProductSecurityEventListener) { bean ->
        bean.autowire = 'byName'
    }
}

答案 1 :(得分:2)

您必须设置eventService属性:

beans = {
    productSecurityEventListener(ProductSecurityEventListener) {
       eventService = ref('eventService')
    }
}