尝试使用本地spring cloud connector / local_configuration_connector时找不到合适的云连接器

时间:2017-01-03 09:10:53

标签: spring spring-boot spring-cloud spring-cloud-config spring-cloud-connectors

我尝试使用本地云弹簧连接器在本地环境中测试我的应用程序,然后才能将其部署到基于CF的云环境。从Spring链接

http://cloud.spring.io/spring-cloud-connectors/spring-cloud-connectors.html#_local_configuration_connector

我按照流程创建了项目资源目录中名为spring-cloud-bootstrap.properties的属性文件。它具有以下内容

spring.cloud.propertiesFile:C:\ Users \ IBM_ADMIN \ git \ ServiceXchange5 \ ServiceXchange \ spring-cloud.properties

我在上面给出的路径中有spring-cloud.properties文件。

从spring configuaration bean我有以下

@EnableWebMvc
@Configuration
@EnableAspectJAutoProxy
public class CloudServiceConfig extends AbstractCloudConfig {

@Bean
public DataSource getDataSource() throws AppException  {

org.springframework.cloud.service.PooledServiceConnectorConfig.PoolConfig poolConfig = new PoolConfig(50, 100, 3000);
org.springframework.cloud.service.relational.DataSourceConfig dbConfig = new DataSourceConfig(poolConfig, null);
return connectionFactory().dataSource(SX_DB_USED, dbConfig);

}

现在,这个DataSource bean被注入到其他各个地方。使用位置中的属性文件,我希望将创建用于本地配置的云连接器bean,并且我应该能够使用相同的方法为DataSource添加更多配置以进行连接池。

然而,当我访问应用程序时,似乎本地配置连接器本身没有激活。

Initialization of bean failed; nested exception is org.springframework.cloud.CloudException: No suitable cloud connector found
[ERROR   ] SRVE0271E: Uncaught init() exception created by servlet [appServlet] in application [ServiceXchange]:  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cloudServiceConfig' defined in file [C:\Users\IBM_ADMIN\git\ServiceXchange5\ServiceXchange\target\classes\com\hcl\service\config\CloudServiceConfig.class]: Initialization of bean failed; nested exception is org.springframework.cloud.CloudException: No suitable cloud connector found
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:2388)
at [internal classes]
Caused by: org.springframework.cloud.CloudException: No suitable cloud connector found
at org.springframework.cloud.CloudFactory.getCloud(CloudFactory.java:55)
at org.springframework.cloud.config.java.AbstractCloudConfig.setBeanFactory(AbstractCloudConfig.java:85)
at com.hcl.service.config.CloudServiceConfig$$EnhancerBySpringCGLIB$$9529c032.CGLIB$setBeanFactory$54(<generated>)
at com.hcl.service.config.CloudServiceConfig$$EnhancerBySpringCGLIB$$9529c032$$FastClassBySpringCGLIB$$6c6301dd.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanFactoryAwareMethodInterceptor.intercept(ConfigurationClassEnhancer.java:277)
at com.hcl.service.config.CloudServiceConfig$$EnhancerBySpringCGLIB$$9529c032.setBeanFactory(<generated>)
at org.springframework.context.annotation.ConfigurationClassPostProcessor$EnhancedConfigurationBeanPostProcessor.postProcessPropertyValues(ConfigurationClassPostProcessor.java:480)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
... 13 more

我不确定为什么本地云连接器未激活。根据链接,它应该在检测到属性文件之后。

注意:我已经尝试将属性文件放在不同的位置,如(直接在应用程序根目录下,在web-inf / lib中,在资源中等)

这里有任何帮助吗?

3 个答案:

答案 0 :(得分:6)

在最近的一个项目中,我们遇到了同样的问题。在云端一切正常,但本地错误&#34;找不到合适的云连接器&#34;被扔了。为了排除依赖性问题,在我们的案例中(将在CloudFoundry环境中部署Spring Boot微服务),以下两个依赖项(由依赖项管理管理的版本)就足够了。

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-spring-service-connector</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-cloudfoundry-connector</artifactId>
</dependency>

应该使用的CloudFoundryConnector检查是否设置了环境变量 VCAP_APPLICATION ,然后才将其标记为合适,否则它将不执行任何操作。通常认为它是在本地环境中复制VCAP_SERVICES和VCAP_APPLICATION变量的反模式,但在我们的用例中,这正是使一切尽可能在本地工作的解决方案。

对于原始问题,这个答案可能为时已晚,但作为其他失去灵魂的起点,碰巧遇到同样的问题,它有望为其他人节省我们花费的调试时间。

答案 1 :(得分:0)

您是否使用maven shade插件打包应用程序?如果是这样,请确保<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>到位。

据我所知,当缺少这个时,Cloud-Foundry连接器会覆盖/覆盖来自Local-Connector的ServiceLoaders。

所有这一切当然只有在您尝试运行本地构建的软件包时才会这样。直接来自IDE(在我的情况下是IntelliJ)它始终有效。

答案 2 :(得分:0)

如果您在本地运行,则可能无法获得Cloud实例,从而导致此情况。需要根据使用情况来确保它是用于本地还是在云上。就我而言,这是在哪里调用它的问题。因此,当部署在云上时,我添加了一个额外的方法来实例化cloudfoundry(CloudFactory()。getCloud())。