在我的应用程序中,我想在命中应用程序URL之前初始化bean,并存储下拉列表的公共值。这里是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();
}
}
豆:
DropDownList.setListMap();
我发现它在应用程序启动时没有初始化。当我尝试通过调用NullPointerException
来更新主人时,它会${listService.listMap['infoList']}
。但是如果我调用jsp页面,我将Map调用为{{1}},它会在jsp之后显示下拉,如果我尝试保存master,它会成功执行。
这意味着当我调用jsp页面时,我显示下拉时间只是初始化bean而不是在应用程序启动时。
答案 0 :(得分:1)
实际问题是你不是静态地访问Spring bean ,而是访问类。当您使用bean时,即listService
实例,Spring会在首次访问时为您初始化它。
您正在调用静态方法,但是当发生这种情况时,不会填充依赖bean。自动装配适用于实例(即在非静态环境中),因此应用程序中systemService
为null
。
更新:我刚刚意识到这一行:
@Autowired
private static SystemService systemService;
这从根本上说是错误的。你不能自动装配静态字段,它在Spring(或任何类似的框架)中完全没有意义。 Spring bean是实例,框架将autowired字段设置为对其他spring bean的引用。