私は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春拡張を使用して、問題が消えることで任意のヒント
'ServletContextListener'は' Spring'ライフサイクルの前に実行されているようです。したがって、 'spring.profiles.active'は解決されません。おそらく、あなたの 'contextInitialized'メソッドからそのキーを手動で取得するようにしてください。 –