天天看點

spring的bean擷取項目根目錄

昨天碰見個問題,maven打包多子產品的web項目。将spring的bean配置在遠端排程系統,排程系統通過發送排程指令到本地,本地通過線程池調用spring的bean。在service子產品打包的jar中,我需要儲存一些檔案到本地,因為不是通過web調用,是以擷取不到項目根目錄,當時也沒想到有什麼好辦法。是以就直接儲存到系統目錄,代碼做預判,目錄不存在就建立,在window下,建立目錄都沒有問題,但是部署到Linux下jboss中,碰見了使用者權限問題,這東西又不能怪人家系統,每次都找運維建立也不現實,估計人家都能煩死。後來在處理檔案的時候發現System.getProperty("file.separator")和System.getProperty("line.separator"),可以通過system擷取系統參數,是以就想也許可以通過提前将系統根目錄注入system,後面再擷取,悲劇,轉了一圈還得擷取系統根目錄。

說了一堆廢話還是看代碼吧:

web.xml:

<context-param>

  <param-name>webAppRootKey</param-name>

  <param-value>dp.root</param-value>

</context-param>

<listener>     

    <listener-class>

        org.springframework.web.util.WebAppRootListener

    </listener-class>

</listener>

WebAppRootListener:

public classWebAppRootListener implements ServletContextListener {

    public voidcontextInitialized(ServletContextEvent event) {

        WebUtils.setWebAppRootSystemProperty(event.getServletContext());

    }

    public voidcontextDestroyed(ServletContextEvent event) {

        WebUtils.removeWebAppRootSystemProperty(event.getServletContext());

    }

}

WebUtils:

    public static void setWebAppRootSystemProperty(ServletContextservletContext) throws IllegalStateException {

        Assert.notNull(servletContext, "ServletContextmust not be null");

        String root =servletContext.getRealPath("/");

        if (root == null) {

            throw newIllegalStateException(

               "Cannot set web app root system property when WAR file is notexpanded");

        }

        String param =servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);

        String key = (param != null ?param : DEFAULT_WEB_APP_ROOT_KEY);

        String oldValue = System.getProperty(key);

        if (oldValue != null&& !StringUtils.pathEquals(oldValue, root)) {

            throw newIllegalStateException(

               "Web app root system property already set to different value:'" +

               key + "' = [" + oldValue + "] instead of [" + root +"] - " +

               "Choose unique values for the 'webAppRootKey' context-param in yourweb.xml files!");

        }

        System.setProperty(key, root);

        servletContext.log("Set web approot system property: '" + key + "' = [" + root + "]");

    }

在bean的代碼中通過System.getProperty("dp.root")擷取系統參數。萬能的spring,感謝之。