0

コードが実行されている環境に基づいて、変数を直接アップロードしようとしています。私はいくつかのコードを書き、問題に遭遇しました。私が間違っていることを教えてください。

WebAppInitializer.java

public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext sc) throws ServletException {
// Create the 'root' Spring application context
AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
root.scan("com.configs");
root.getEnvironment().setActiveProfiles("dev");
root.refresh();


// Manages the lifecycle of the root application context
sc.addListener(new ContextLoaderListener(root));

// Handles requests into the application
ServletRegistration.Dynamic appServlet = sc.addServlet("appServlet",
                               new DispatcherServlet(new GenericWebApplicationContext()));
appServlet.setLoadOnStartup(1);
Set<String> mappingConflicts = appServlet.addMapping("/");

if (!mappingConflicts.isEmpty()) {
    throw new IllegalStateException(
                    "'appServlet' could not be mapped to '/' due "
                    + "to an existing mapping. This is a known issue under Tomcat versions "
                    + "<= 7.0.14; see https://issues.apache.org/bugzilla/show_bug.cgi?id=51278");
}

}

}

DynamicConfig.java

@Configuration
@Profile("dev")
@PropertySource("classpath:/devel.properties")

public class DynamicConfig {

@Autowired 
Environment env;

@Bean
public TestClass testClass(){
    TestClass testClass = new TestClass();
    testClass.setEnvironment(env.getProperty("environment"));
    return testClass;       
}

}

TestClassは、環境に基づいた構成から取得される1つのインスタンス変数を持つ単純なクラスです。

TestCase:パッケージcom.tester;

 import org.junit.Test;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;

 import com.configs.DynamicConfig;
  import com.configs.EnvironmentDetector;
 import com.tester.TestClass;

 public class TestClassTest {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DynamicConfig.class);

 @Test
public void test(){
    ApplicationContext context = new AnnotationConfigApplicationContext(DynamicConfig.class);
   context.getEnvironment().setActiveProfiles("dev");
     context.scan("com.configs");
    TestClass test = context.getBean(TestClass.class);
    System.out.println(test.getEnvironment());
}

}

今、私はエラーを下回っています

    Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.282 sec <<< FAILURE!
  test(com.tester.TestClassTest)  Time elapsed: 0.279 sec  <<< ERROR!
 org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.tester.TestClass] is defined: expected single bean but found 0: 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:280)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1106)
at com.tester.TestClassTest.test(TestClassTest.java:16)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:146)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)
at $Proxy0.invoke(Unknown Source)
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:145)
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:87)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

DynamicConfig.javaコードから@profile( "dev")行を削除すると、正常に実行されます。しかし、私はそれが欲しいです。prod用に同様のクラスを作成したいと思います。

助けてください

ありがとう

4

1 に答える 1

2

テストクラスを更新して、プロファイルをアクティブ化します。現在、テストのコンテキストで実行されていないWebApplicationInitializerにプロパティを追加してアクティブ化しています。

それをアクティブにする1つの方法は、次のことですが、それが唯一の方法ではありません。

 @RunWith(SpringJUnit4ClassRunner.class)
 @ActiveProfiles({"dev"})
 @ContextConfiguration(classes = {DynamicConfig.class})
 public class TestClassTest {

 @Autowired
 TestClass testClass;

 @Test
 public void test(){
      System.out.println(testClass.getEnvironment());
 }
于 2012-11-02T20:32:18.397 に答える