2017-04-24 15 views
0

デプロイメントからデプロイメントに変化するコンテキストと、すべてのデプロイメントで一定のコンテキストがあります。デプロイメント依存のビットは、jarまたはwarの外部にあるconfig.xmlファイルにあります。静的コンテキストstuffは注釈設定クラスにあります。そのトリックは、config.xmlからのbeanを使用する注釈設定です。アプリの場合、configクラスにインポートされます。しかしwebappでは、そのファイルを見つけることができません。SpringConfig.classのconfig.xmlのspring-beansを使用します。

SpringConfigクラス

@Component 
@Configuration 
@ImportResource("file:./config.xml") 
public class SpringConfig { 

    @Autowired private String local_timezone_string; 
    @Autowired private String startDateFormatString; 
    @Autowired private String startDateString; 

    @Bean 
    public TimeZone localTimeZone() { 
     return TimeZone.getTimeZone(local_timezone_string); 
    } 

    @Bean 
    public SimpleDateFormat startDateFormat() { 
     SimpleDateFormat sdf = new SimpleDateFormat(startDateFormatString); 
     sdf.setTimeZone(localTimeZone()); 
     return sdf; 
    } 

    @Bean 
    public long jaceThreadStartDate() throws ParseException { 
     return startDateFormat().parse(jaceThreadStartDateString).getTime(); 
    } 

    ... a bunch of other beans 
} 

とconfig.xmlの

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="local_timezone_string" class="java.lang.String"><constructor-arg value="Canada/Atlantic"/></bean> 
    <bean id="startDateFormatString" class="java.lang.String"><constructor-arg value="yyyy-MM-dd"/></bean> 
    <bean id="startDateString" class="java.lang.String"><constructor-arg value="2017-04-06"/></bean> 

    ... other beans 

</beans> 

SpringConfigが展開フォルダにconfig.xmlを探し、特定の展開を使用するように、config.xmlには、jarファイルに含まれていませんコンテキスト。しかしWebApplicationInitializerを介してwebappにSpringConfigをデプロイすると、config.xmlが見つからなくなります。もちろん。では、デプロイメント依存のコンテキスト内のBeanは、Webアプリケーション内の静的コンテキストにどのようにロードできますか? @Configurationと@ComponentsのパッケージをスキャンするようにAnnotationConfigApplicationContextに指示する方法はありますか? webappのXML設定からBeanを登録した後に

私はおそらく、コンストラクタ内でsetParent(config.xmlコンテキスト)を呼び出してAnnotationConfigWebApplicationContext(SpringConfig.class)を呼び出すAnnotationConfigWebApplicationContextから派生したクラスを考えています。

または、AnnotationConfigApplicationContext(String ... basePackages)を呼び出す代わりに、AnnotationConfigApplicationContext()、setParent(...)、次にscan(...)を呼び出します。

答えて

0

したがって、setParent()とscan()を使用する方法があります。

@Component 
@Configuration 
public class SpringConfig { 

    private static final Logger log = Logger.getLogger(SpringConfig.class); 
    @Autowired private DriverManagerDataSource pgDataSource; 
    @Autowired private String local_timezone_string; 
    @Autowired private String startDateFormatString; 
    @Autowired private String startDateString; 

    private static ApplicationContext getVariableContext() throws Exception { 

     ApplicationContext variableContext = null; 
     try { 
      variableContext = new FileSystemXmlApplicationContext("./config.xml"); 
      log.info("got config.xml from file system"); 
     } catch (Exception e) { 
      try { 
       variableContext = new ClassPathXmlApplicationContext("config.xml"); 
       log.info("got config.xml from class path"); 
      } catch (Exception ex) { 
       log.info("failed to get config.xml"); 
       throw new Exception(...); 
      } 
     } 
     return variableContext; 
    } 

    public static WebApplicationContext getWebApplicationContext() throws ServletException { 

     try { 
      ApplicationContext variableContext = getVariableContext(); 
      AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext(); 
      appContext.setParent(variableContext); 
      appContext.scan(
        "com.us.systemdiagnostics", 
        "com.us.systemdiagnostics.webservice" 
      ); 
      appContext.refresh(); 
      return appContext; 

     } catch (Exception e) { 
      throw new ServletException(...); 
     } 
    } 

    public static ApplicationContext getStandAloneApplicationContext() throws ServletException { 

     try { 
      ApplicationContext variableContext = getVariableContext(); 
      AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(); 
      appContext.setParent(variableContext); 
      appContext.scan(
        "com.us.systemdiagnostics", 
        "com.us.systemdiagnostics.webservice" 
      ); 
      appContext.refresh(); 
      return appContext; 

     } catch (Exception e) { 
      throw new Exception(...); 
     } 
    } 

    ... beans, etc ... 
} 
関連する問題