1. 程式人生 > >javax.naming.NamingException: Cannot create resource instance

javax.naming.NamingException: Cannot create resource instance

今天在線上的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

這個bean的例項使用。

而之前會出錯應該是@WebListener@Resource初始化順序導致,而且我換成@AutoWired還是不行。