Spring Boot Cloud Foundry 错误中没有唯一的服务处理接口错误
No unique service maching interface error in Spring Boot Cloud Foundry error
我正在尝试按照本教程 https://github.com/cf-platform-eng/spring-boot-cities/tree/master/cities-service 来 运行 我在 Cloud Foundry 中的 spring 启动应用程序。我有本地 bosh-lite 安装
我的 Spring 引导应用程序连接到 postgresql 作为数据库。我正在尝试连接到本地(主机)
上的 Postgresql 实例 运行ning
如果部署到本地 tomcat,我的应用程序在本地工作正常。
但是当我将应用程序部署到 bosh-lite 时,它失败并出现以下错误 "No unique service maching interface error "。除了我使用 Maven 构建我的代码外,我的代码与教程中提到的完全相同。
2017-06-07T22:29:54.44+0530 [App/0] OUT Caused by: org.springframework.cloud.CloudException: No unique service matching interface javax.sql.DataSource found. Expected 1, found 0
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.springframework.cloud.Cloud.getSingletonServiceConnector(Cloud.java:149) ~[spring-cloud-core-1.2.3.RELEASE.jar!/:na]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.saurav.cf.casestudy.employee.db.DataSourceConfiguration.dataSource(DataSourceConfiguration.java:20) ~[classes/:na]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.saurav.cf.casestudy.employee.db.DataSourceConfiguration$$EnhancerBySpringCGLIB$7aab5e.CGLIB$dataSource[=11=](<generated>) ~[classes/:na]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.saurav.cf.casestudy.employee.db.DataSourceConfiguration$$EnhancerBySpringCGLIB$7aab5e$$FastClassBySpringCGLIB$ad81e2b.invoke(<generated>) ~[classes/:na]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358) ~[spring-context-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.saurav.cf.casestudy.employee.db.DataSourceConfiguration$$EnhancerBySpringCGLIB$7aab5e.dataSource(<generated>) ~[classes/:na]
2017-06-07T22:29:54.44+0530 [App/0] OUT at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
我与 postgres 的连接工作正常。如果我不使用 spring 云连接器并正常从 application.properties.
读取值,则同一个应用程序工作正常
我的 pom.xml`(具有 spring 引导云连接器和 postgrsql 驱动程序的依赖项)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.saurav.cf.casestudy</groupId>
<artifactId>employeerest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>employeerest</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<!-- <start-class>org.saurav.cf.casestudy.employee.EmployeerestApplication</start-class> -->
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cloud-connectors</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
`
[更新]
根据斯科特在下面的回答,我查看了 UPS 的要求,云 connector.Since 我的是用户提供的服务,所以我不能有标签和标签。但我添加了 jdbc 网址。
现在我的应用程序因以下错误而失败
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
为此,我在 application.properties 中设置了 "spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect"
,但它仍然不起作用
我还检查了我的数据库 运行ning 以及我的服务实例中的数据库设置是否正确。
下面是我的服务实例内容`
"VCAP_SERVICES": {
"user-provided": [
{
"credentials": {
"jdbcUrl": "jdbc:postgresql://10.0.2.2:5432/employee",
"username": "postgres",
"password": "admin",
"postgresUri": "postgresql://10.0.2.2:5432/employee",
"uri": "postgresql://10.0.2.2:5432/employee"
},
"label": "user-provided",
"name": "postgresql-cf-service",
"syslog_drain_url": "",
"tags": [],
"volume_mounts": []
}
]
}
`
最好的祝福,
索拉夫
如果您将 spring-boot-starter-cloud-connectors
作为依赖项包含在内,则 Spring 云连接器将尝试创建连接到数据库所必需的 java.sql.DataSource
bean。连接器通过寻找 service binding that has certain characteristics 来做到这一点。 No unique service matching interface javax.sql.DataSource found
消息表示连接器无法找到适当类型的服务绑定。
如果您想像在该示例应用程序中一样使用连接器,则需要创建一个 user-provided service instance 包含 Postgres 连接的详细信息并将该服务实例绑定到该应用程序。
或者,您可以删除 spring-boot-starter-cloud-connectors
依赖项,而是使用 application.yml
中的 spring.datasource
属性配置数据库连接。
这些选项在 blog post 中有更详细的解释。
只是为其他读者总结一下整体解决方案。
如果您有这样的场景,您希望 spring 启动应用程序与数据库(托管在其他机器上)对话,然后 运行 来自云铸造厂的应用程序。然后按照下面的一些提示进行操作。
- 部署 Spring 启动应用程序并希望使用 Spring 启动云连接器后,请确保您的类路径中具有所有正确的依赖项(spring-boot-cloud-连接器和罐子。
- 如果您想将服务实例与应用程序绑定。请确保凭据符合此规范http://cloud.spring.io/spring-cloud-connectors/spring-cloud-cloud-foundry-connector.html#_postgresql
- 在服务实例参数中确保使用 uri 参数不依赖于用户名和密码来构造 uri
- 确保您的数据库实例确实 运行ning 并且您已创建应用程序服务组以允许从您的 Cloud Foundry 应用程序进行出站通信。 https://docs.cloudfoundry.org/concepts/asg.html#viewing
第 3 步和第 4 步是我犯的错误。更正后应用程序工作正常。
此致,
索拉夫
我正在尝试按照本教程 https://github.com/cf-platform-eng/spring-boot-cities/tree/master/cities-service 来 运行 我在 Cloud Foundry 中的 spring 启动应用程序。我有本地 bosh-lite 安装
我的 Spring 引导应用程序连接到 postgresql 作为数据库。我正在尝试连接到本地(主机)
上的 Postgresql 实例 运行ning如果部署到本地 tomcat,我的应用程序在本地工作正常。 但是当我将应用程序部署到 bosh-lite 时,它失败并出现以下错误 "No unique service maching interface error "。除了我使用 Maven 构建我的代码外,我的代码与教程中提到的完全相同。
2017-06-07T22:29:54.44+0530 [App/0] OUT Caused by: org.springframework.cloud.CloudException: No unique service matching interface javax.sql.DataSource found. Expected 1, found 0
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.springframework.cloud.Cloud.getSingletonServiceConnector(Cloud.java:149) ~[spring-cloud-core-1.2.3.RELEASE.jar!/:na]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.saurav.cf.casestudy.employee.db.DataSourceConfiguration.dataSource(DataSourceConfiguration.java:20) ~[classes/:na]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.saurav.cf.casestudy.employee.db.DataSourceConfiguration$$EnhancerBySpringCGLIB$7aab5e.CGLIB$dataSource[=11=](<generated>) ~[classes/:na]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.saurav.cf.casestudy.employee.db.DataSourceConfiguration$$EnhancerBySpringCGLIB$7aab5e$$FastClassBySpringCGLIB$ad81e2b.invoke(<generated>) ~[classes/:na]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358) ~[spring-context-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.saurav.cf.casestudy.employee.db.DataSourceConfiguration$$EnhancerBySpringCGLIB$7aab5e.dataSource(<generated>) ~[classes/:na]
2017-06-07T22:29:54.44+0530 [App/0] OUT at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
我与 postgres 的连接工作正常。如果我不使用 spring 云连接器并正常从 application.properties.
读取值,则同一个应用程序工作正常我的 pom.xml`(具有 spring 引导云连接器和 postgrsql 驱动程序的依赖项)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.saurav.cf.casestudy</groupId>
<artifactId>employeerest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>employeerest</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<!-- <start-class>org.saurav.cf.casestudy.employee.EmployeerestApplication</start-class> -->
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cloud-connectors</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
`
[更新] 根据斯科特在下面的回答,我查看了 UPS 的要求,云 connector.Since 我的是用户提供的服务,所以我不能有标签和标签。但我添加了 jdbc 网址。 现在我的应用程序因以下错误而失败
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
为此,我在 application.properties 中设置了 "spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect"
,但它仍然不起作用
我还检查了我的数据库 运行ning 以及我的服务实例中的数据库设置是否正确。
下面是我的服务实例内容`
"VCAP_SERVICES": {
"user-provided": [
{
"credentials": {
"jdbcUrl": "jdbc:postgresql://10.0.2.2:5432/employee",
"username": "postgres",
"password": "admin",
"postgresUri": "postgresql://10.0.2.2:5432/employee",
"uri": "postgresql://10.0.2.2:5432/employee"
},
"label": "user-provided",
"name": "postgresql-cf-service",
"syslog_drain_url": "",
"tags": [],
"volume_mounts": []
}
]
}
` 最好的祝福, 索拉夫
如果您将 spring-boot-starter-cloud-connectors
作为依赖项包含在内,则 Spring 云连接器将尝试创建连接到数据库所必需的 java.sql.DataSource
bean。连接器通过寻找 service binding that has certain characteristics 来做到这一点。 No unique service matching interface javax.sql.DataSource found
消息表示连接器无法找到适当类型的服务绑定。
如果您想像在该示例应用程序中一样使用连接器,则需要创建一个 user-provided service instance 包含 Postgres 连接的详细信息并将该服务实例绑定到该应用程序。
或者,您可以删除 spring-boot-starter-cloud-connectors
依赖项,而是使用 application.yml
中的 spring.datasource
属性配置数据库连接。
这些选项在 blog post 中有更详细的解释。
只是为其他读者总结一下整体解决方案。
如果您有这样的场景,您希望 spring 启动应用程序与数据库(托管在其他机器上)对话,然后 运行 来自云铸造厂的应用程序。然后按照下面的一些提示进行操作。
- 部署 Spring 启动应用程序并希望使用 Spring 启动云连接器后,请确保您的类路径中具有所有正确的依赖项(spring-boot-cloud-连接器和罐子。
- 如果您想将服务实例与应用程序绑定。请确保凭据符合此规范http://cloud.spring.io/spring-cloud-connectors/spring-cloud-cloud-foundry-connector.html#_postgresql
- 在服务实例参数中确保使用 uri 参数不依赖于用户名和密码来构造 uri
- 确保您的数据库实例确实 运行ning 并且您已创建应用程序服务组以允许从您的 Cloud Foundry 应用程序进行出站通信。 https://docs.cloudfoundry.org/concepts/asg.html#viewing
第 3 步和第 4 步是我犯的错误。更正后应用程序工作正常。
此致, 索拉夫