Spring Webs在Web应用程序中无法识别

时间:2014-07-13 20:06:14

标签: spring spring-mvc

我试图根据指定的配置文件实现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

2 个答案:

答案 0 :(得分:2)

好的,我得到了它的工作。在Web应用程序初始化期间,需要在根上下文(而不是servlet上下文)中设置配置文件。我已经在我的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 :(得分:1)

  

配置文件是一个命名的逻辑分组,可以通过ConfigurableEnvironment.setActiveProfiles(java.lang.String ...)以编程方式激活,也可以通过设置spring.profiles.active属性(通常通过JVM系统属性)以声明方式激活,作为环境变量,或Web应用程序作为web.xml中的Servlet上下文参数。

我想说,除非您使用Spring Boot,否则无法将活动配置文件指定为属性文件中的属性,这也可以让您在application.properties文件中设置活动配置文件。

尝试使用上述选项之一。