Spring 2.5.6 JMX NotificationPublisher invocation throwing NPE

162 views Asked by At

I am getting Caused by: java.lang.NullPointerException sometimes. Looks like spring is not able to inject org.springframework.jmx.export.notification.NotificationPublisher properly. I am using spring 2.5.6 and deployed in WebSphere 7. How can we resolve this NPE issue?

import javax.management.Notification;

import org.springframework.jmx.export.notification.NotificationPublisher;
import org.springframework.jmx.export.notification.NotificationPublisherAware;

import com.xyz.SpringUtil;
import com.xyz.notification.INotificationMBean;
import com.xyz.security.impl.SpringSecurityHelper;

/**
 * provides a central class for the publishing of Notifications. This allows us to centralize all notification
 * Listeners configuration in a central location, for this one MBean.
 */
public class NotificationMBean implements INotificationMBean, NotificationPublisherAware {

    /** used to publish notifications. This will be set automatically by Spring */
    private NotificationPublisher notificationPublisher;
    private String proxyUser; // set by Spring - used for RMI-direct calls
    private SpringSecurityHelper securityHelper;

    protected SpringSecurityHelper getSecurityHelper() {
        if (securityHelper == null) {
            securityHelper = (SpringSecurityHelper) SpringUtil.getApplicationContext().getBean(
                    SpringSecurityHelper.SPRING_SECURITY_HELPER);
        }

        return securityHelper;
    }

    protected void setSecurityHelper(SpringSecurityHelper securityHelper) {
        this.securityHelper = securityHelper;
    }

    /**
     * {@inheritDoc}
     */
    public void publishNotification(Notification notif) {
        getSecurityHelper().switchUserIfUnauthenticated(getProxyUser());
        getNotificationPublisher().sendNotification(notif);
    }

    /**
     * Setter for notificationPublisher.
     * @param notificationPublisher NotificationPublisher
     */
    public void setNotificationPublisher(NotificationPublisher notificationPublisher) {
        this.notificationPublisher = notificationPublisher;
    }

    /**
     * Getter for the notificationPublisher.
     * @return NotificationPublisher Returns the notificationPublisher.
     */
    private NotificationPublisher getNotificationPublisher() {
        return notificationPublisher;
    }

    /**
     * {@inheritDoc}
     */
    public String getProxyUser() {
        return proxyUser;
    }

    /**
     * {@inheritDoc}
     */
    public void setProxyUser(String username) {
        this.proxyUser = username;
    }
}
1

There are 1 answers

0
JB. On

The error is gone after adding the below declaration to my spring context file

<property name="notificationListeners">
            <list>
                <bean class="com.xyz.mbean.impl.XYZNotificationListenerBean">
                    <constructor-arg>
                        <ref bean="notificationListenerToDatabase" />
                    </constructor-arg>
                    <property name="namingStrategy" ref="mbeanNamingStrategy" />
                    <property name="mappedObjectNameTypePairs">
                        <map>
                            <entry>
                                <key>
                                    <value>sequenceGeneratorEarNotificationMBean</value>
                                </key>
                                <ref bean="NotificationMBean" />
                            </entry>
                        </map>
                    </property>
                </bean>
                <bean class="com.xyz.mbean.impl.XYZNotificationListenerBean">
                    <constructor-arg>
                        <ref bean="notificationListenerToTopic" />
                    </constructor-arg>
                    <property name="namingStrategy" ref="mbeanNamingStrategy" />
                    <property name="mappedObjectNameTypePairs">
                        <map>
                            <entry>
                                <key>
                                    <value>sequenceGeneratorEarNotificationMBean</value>
                                </key>
                                <ref bean="NotificationMBean" />
                            </entry>
                        </map>
                    </property>
                </bean>
                <bean class="com.xyz.mbean.impl.XYZNotificationListenerBean">
                    <constructor-arg ref="notificationListenerToExternal" />
                    <property name="namingStrategy" ref="mbeanNamingStrategy" />
                    <property name="mappedObjectNameTypePairs">
                        <map>
                            <entry key="sequenceGeneratorEarNotificationMBean" value-ref="NotificationMBean" />
                        </map>
                    </property>
                </bean>
            </list>
        </property>
    </bean>