2014-07-13 4 views
1

지정된 프로파일을 기반으로 특정 클래스 구현을로드하기 위해 스프링 프로파일을 구현하려고합니다. 사용할 프로파일은 클래스 경로에 포함 된 특성 파일 내에서 특성 (spring.profiles.active)으로 지정됩니다. 여기웹 응용 프로그램에서 스프링 프로파일이 인식되지 않습니다.

출처 : https://github.com/overattribution/spring-profile-test

public interface MyService { 
    public void doSomething(); 
} 

@Service 
@Profile("preprod") 
public class MyServicePreProdImpl implements MyService { 
    private final Logger LOG = LoggerFactory.getLogger(MyServicePreProdImpl.class); 
    @Override 
    public void doSomething() { 
     LOG.debug("Doing something in " + MyServicePreProdImpl.class.getName()); 
    } 
} 

@Service 
@Profile("prod") 
public class MyServiceProdImpl implements MyService { 
    private final Logger LOG = LoggerFactory.getLogger(MyServiceProdImpl.class); 
    @Override 
    public void doSomething() { 
     LOG.debug("Doing something in " + MyServiceProdImpl.class.getName()); 
    } 
} 

는 그러나, 나는 다음과 같은 오류를 받고 있어요 : 의존성에 대한 발견 [com.example.profileservice.MyService] 유형의 없음 자격 콩.

무엇이 누락 되었습니까?

UPDATE 1 :

내가 수동으로 웹 응용 프로그램 초기화하는 동안 활성 프로파일을 설정하고있어,하지만 난 여전히 오류 "어떤 자격 콩을 찾을 수 없습니다"얻고있다. 변화는 여기에서 볼 수있다 : https://github.com/overattribution/spring-profile-test/commit/09175a10b28ea8e5a08b43ad1416431bcf094c9d

답변

2

좋아요. 작동하도록했습니다. 프로필은 웹 응용 프로그램을 초기화하는 동안 루트 컨텍스트 (서블릿 컨텍스트와 반대)에서 설정해야합니다. 나는 그렇게처럼 내 WebAppInitializer 클래스에서 이렇게 한 : 나는 이전에 나에게이 기능을 준 봄 부트 프로젝트에서 마이그레이션하고

https://github.com/overattribution/spring-profile-test/blob/f895a8bc67dc1f6ba2fcedb58b73a19cc5cf8cf7/src/main/java/com/example/config/WebAppInitializer.java

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    /** 
    * Overriding to include setting active profile. 
    */ 
    @Override 
    protected WebApplicationContext createRootApplicationContext() { 
     Class<?>[] configClasses = getRootConfigClasses(); 
     if (!ObjectUtils.isEmpty(configClasses)) { 
      AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext(); 

      String[] activeProfiles = getActiveProfiles(); 
      rootAppContext.getEnvironment().setActiveProfiles(activeProfiles); 

      rootAppContext.register(configClasses); 
      return rootAppContext; 
     } 
     else { 
      return null; 
     } 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[]{"/"}; 
    } 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class<?>[] { 
       ApplicationConfig.class 
     }; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class<?>[] { 
       WebMvcConfig.class 
     }; 
    } 

    @Override 
    protected Filter[] getServletFilters() { 
     CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); 
     characterEncodingFilter.setEncoding("UTF-8"); 
     characterEncodingFilter.setForceEncoding(true); 
     return new Filter[] {characterEncodingFilter}; 
    } 


    protected String[] getActiveProfiles() { 
     PropertySource propertySource = null; 
     try { 
      propertySource = new ResourcePropertySource("classpath:application.properties"); 
      String profilesString = (String) propertySource.getProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME); 
      return profilesString.split(","); 
     } catch (IOException e) { 
      throw new ResourceAccessException("application.properties is not available on the classpath"); 
     } 
    } 

} 
1

A profile is a named logical grouping that may be activated programmatically via ConfigurableEnvironment.setActiveProfiles(java.lang.String...) or declaratively through setting the spring.profiles.active property, usually through JVM system properties, as an environment variable, or for web applications as a Servlet context parameter in web.xml.

나는 당신의 속성 내에서 속성 당신은 또한 당신이 application.properties 파일에 활성 프로파일을 설정할 수 있습니다 그 봄 부팅을 사용하지 않는 파일로 활성화 된 프로파일을 지정할 수 없습니다 말 것 .

위 옵션 중 하나를 사용하십시오.

+0

. 그들이 어떻게 그랬는지 궁금해? – Corey

+0

Spring Boot에서는'application.properties'에 활성 프로파일을 설정할 수도 있습니다. 그에 따라 대답을 편집했습니다. – pgiecek

+0

그래서 나에게는 application.properties에서 속성을 선택하고 ConfigurableEnvironment.setActiveProfiles (java.lang.String ...)를 사용하여 해당 값을 설정하는 Java 클래스를 추가해야한다고 생각됩니다. – Corey

관련 문제