我试图根据指定的配置文件实现Spring Profiles来加载特定的类实现。要使用的配置文件在类路径中包含的属性文件中指定为属性(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]类型的限定bean用于依赖。
我错过了什么?
更新1:
我在Web应用程序初始化期间手动设置活动配置文件,但我仍然没有找到"没有找到合格的bean"错误。可在此处查看更改:https://github.com/overattribution/spring-profile-test/commit/09175a10b28ea8e5a08b43ad1416431bcf094c9d
答案 0 :(得分:2)
好的,我得到了它的工作。在Web应用程序初始化期间,需要在根上下文(而不是servlet上下文)中设置配置文件。我已经在我的WebAppInitializer类中这样做了:
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 :(得分:1)
配置文件是一个命名的逻辑分组,可以通过ConfigurableEnvironment.setActiveProfiles(java.lang.String ...)以编程方式激活,也可以通过设置spring.profiles.active属性(通常通过JVM系统属性)以声明方式激活,作为环境变量,或Web应用程序作为web.xml中的Servlet上下文参数。
我想说,除非您使用Spring Boot,否则无法将活动配置文件指定为属性文件中的属性,这也可以让您在application.properties
文件中设置活动配置文件。
尝试使用上述选项之一。