javax.naming.NamingException: Cannot create resource instance
阿新 • • 發佈:2018-12-09
今天在線上的tomcat跑一個SpringBoot程式時報了這個異常,奇怪的是我本地idea除錯的時候沒有這個問題,能正常跑。
看了下catalina.out,報了一些莫名其妙的錯誤,類找不到之類的。但我之前根本就沒有動過這些類啊。
然後又查看了下localhost.2018-11-27.log
,發現了javax.naming.NamingException: Cannot create resource instance,並且指向了我的InitListener
,部分程式碼如下
@WebListener
public class InitListener
implements ServletContextListener
{
@Resource
private Environment env;
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
LOG.info("InitListener initialized");
String profile = env.getProperty(CommonConstants.PROFILE);
AlarmUtil.init(profile) ;
}
}
推斷是因為這個@WebListener
我加入了一個@Resource
導致使用了未載入的 Envrionment
物件導致。去掉後再嘗試發現果然不報錯。但這裡業務需要必須要最先載入配置,所以這個地方我採用了土方法如下:
Environment env = (Environment) WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext()).getBean("environment");
也就是說,Spring的WebApplicationContext已經初始化完成並作為一個屬性放在了servletContext裡,所以這裡我們直接可以用他來找到environment
而之前會出錯應該是@WebListener
和@Resource
初始化順序導致,而且我換成@AutoWired
還是不行。