简体   繁体   中英

Spring Bean is not initializing on Application startup

In my application i want to initialize the bean before hitting application url, and store the common values for drop-down. here it is declaration for bean

<beans:bean id="listService" class="com.system.beans.DropDownList"
        init-method="populateMasterList" scope="application"/>

Bean:

public class DropDownList implements InitializingBean
{
    private static final Logger                     logger  = LoggerFactory.getLogger(DropDownList.class);
    public static Map<String, Map<Integer, String>> listMap = new HashMap<String, Map<Integer, String>>();
    @Autowired
    private static SystemService                    systemService;

    @Autowired(required = true)
    @Qualifier(value = "systemService")
    public void setSystemService(SystemService systemService)
    {
        this.systemService = systemService;
    }

    @PostConstruct
    public static Map<String, Map<Integer, String>> populateMasterList()
    {
        logger.debug("Calling Institute Info Masters");
        List<InstituteInfoMaster> masterList = systemService.listInstituteInfoMasters();
        Map<Integer, String> masterMap = new HashMap<Integer, String>();
        masterMap.put(0, "---Select---");
        masterList.forEach((master) ->
        {
            masterMap.put(master.getListId(), master.getValue());
        });
        logger.debug("Created Map for List Masters");
        listMap.put("infoList", masterMap);
        return listMap;
    }

    public Map<String, Map<Integer, String>> getListMap()
    {
        return listMap;
    }

    public static void setListMap()
    {
        listMap = populateMasterList();
    }

    @Override
    public void afterPropertiesSet() throws Exception
    {
        populateMasterList();

    }
}

I observed that it does not initializes on Application startup. when i try to update the master by calling DropDownList.setListMap(); it gives NullPointerException . but if i calls the jsp page where i am calling the Map as ${listService.listMap['infoList']} it displays the Drop-down on jsp after it if i tries to save master it executes successfully.

it means when i calls the jsp page where i am showing drop-down that time only it initializing the bean not on Application startup.

The actual problem is that you are not accessing the Spring bean , but the class, staticly. When you use the bean, ie the listService instance, Spring will initalize it for you on first access.

You are calling a static method, but when this happens, the dependant beans are not populated. Autowiring works for instances (ie in non-static context), so systemService is null in your application.

Update: I have just realized this line:

@Autowired
private static SystemService systemService;

This is fundamentally wrong. You cannot autowire static fields, it makes absolutely no sense in Spring (or in any similar framework). Spring beans are instances, and the framework set the autowired fields to references to other spring beans.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM