2016-10-04 2 views
0

私はSpring 3.1.4を使用している古いプロジェクトを変更しています。ServletContextListenerがweb.xmlからのファイルパスを使用する前に、JUnitテストのシステムプロパティを設定します。

私はLogbackを設定するためにStartupListenerを使用しようとしています:私はJUnitテストIを実行すると、今

<context-param> 
    <param-name>logFileName</param-name> 
    <param-value>/WEB-INF/config/${spring.profiles.active}/logback.xml</param-value> 
</context-param> 

:それは、web.xmlからファイルパスを読んでいる

public class LoggingStartupListener implements ServletContextListener { 

    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingStartupListener.class.getName()); 


@Override 
public void contextInitialized(final ServletContextEvent sce) { 
    final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); 
    context.reset(); 
    final JoranConfigurator configurator = new JoranConfigurator(); 
    final ServletContext servletContext = sce.getServletContext(); 
    final StringBuilder filePath = new StringBuilder(100); 
    filePath.append(servletContext.getRealPath("/")); 
    filePath.append(servletContext.getInitParameter("logFileName")); 
    InputStream configStream = null; 
    try { 
     configStream = FileUtils.openInputStream(new File(filePath.toString())); 

... 

java.io.FileNotFoundException: File '/var/folders/v7/1r3m8y8j487dqj7vmvb4n4kxcw70fj/T/tomcat-embedded-77438108580291256392.tmp/webapps/myproject/WEB-INF/config/${spring.profiles.active}/logback.xml' does not exist 
at org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:136) 

これは、プロパティーspring.profiles.activeが決して再構築されないことを意味します。解決される。エラーがスローされた後に、このメソッドは道と呼ばれているので、

@BeforeClass 
public static void setSystemProperty() { 
    System.out.println("---------------------BeforeClass--------------------"); 
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); 
    ctx.getEnvironment().setActiveProfiles("local"); 
    ctx.refresh(); 

    System.setProperty("spring.profiles.active", "local"); 
} 

は、しかし、それは動作しませんでした:

1)私はテストの前にプロパティを設定しようとした:

は、私は物事のすべての種類を試してみました。 ( "---------- BeforeClass --------------"はログのエラーの後に表示されます)。

2)私は前にアノテーションを使ってみました試験クラス:

@ActiveProfiles(profiles = "local") 

3)私はspring-test.propertiesファイルにプロパティを設定しようとした:

spring.profile.active=local 

とテストコンテキストに含める:

<context:property-placeholder location="classpath:spring-test.properties"/> 

-

4まったく>効果なし)私ものServletContextListenerで直接プロパティを設定しようとしました:これは、それはないはずが働いているはずなので

@Override 
public void contextInitialized(final ServletContextEvent sce) { 
    System.setProperty("spring.profiles.active", "local"); 
    ... 

そして、これは本当に、私を驚かせましたか?

古いSpringバージョンを使用しているため、これらの問題が発生しますか。 Springバージョンの高い他のプロジェクトでは、これらの問題は一度もありませんでした。 または私は何が欠けていますか?

リスナーを後で起動するように設定することはできますか?あるいは、ServletContextListenerを起動する前にユニット・テストを設定してシステム・プロパティを設定することはできますか?

また、これらの問題を回避するために、別の方法でログバックを初期化する方がよいでしょう。しかし、なぜ他のプロジェクトに表示されないのでしょうか?

が、私はこれを見つけたが、私はそれが私の場合に適用されるかどうかわからない: Spring-test and ServletContextListener in web.xml

これは、Spring MVCのテストを使用してのServletContextListenerを設定する方法はありませんと言います。それは私が

wac.getServletContext().setInitParameter(name, value); 

とコンテキストのparamを上書きしようとすることができます。しかし、私はテストクラスが初期化される前に、web.xmlのは明らかに読み込まれるので、どこにそれを行うにはとき/知らないだろうと言います。私が代わりに私たち自身の実装のlogback春拡張を使用して、問題が消えることで任意のヒント

+0

'ServletContextListener'は' Spring'ライフサイクルの前に実行されているようです。したがって、 'spring.profiles.active'は解決されません。おそらく、あなたの 'contextInitialized'メソッドからそのキーを手動で取得するようにしてください。 –

答えて

0

を事前に

どうもありがとう!

私は、このマニュアルで使用

:機能の https://github.com/qos-ch/logback-extensions/wiki/Spring

一つは次のとおりです。 - 「春のリソースパスとシステムプロパティのプレースホルダを使用してlogback.xmlの場所を指定します。」

正確に私が必要としたもの。 logback-ext-springをバージョン0.1.4で使用しました。

関連する問題