Нет ошибки интерфейса уникальной сервисной обработки в Spring Boot Cloud Foundry
Я пытаюсь следовать этому руководству https://github.com/cf-platform-eng/spring-boot-cities/tree/master/cities-service для запуска моего весеннего загрузочного приложения в Cloud Foundry. У меня есть локальная установка Bosh-Lite
Приложение Spring Boot подключается к postgresql в качестве базы данных. Я пытаюсь подключиться к экземпляру Postgresql, работающему на моем локальном компьютере (хосте)
Мое приложение отлично работает локально, если развернуто на локальном коте. Но когда я развертываю приложение в bosh-lite, оно завершается с ошибкой "Нет уникальной ошибки интерфейса обработки службы". Мой код полностью совпадает с тем, что упоминается в руководстве, за исключением того, что я использую 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$$847aab5e.CGLIB$dataSource$0(<generated>) ~[classes/:na]
2017-06-07T22:29:54.44+0530 [App/0] OUT at org.saurav.cf.casestudy.employee.db.DataSourceConfiguration$$EnhancerBySpringCGLIB$$847aab5e$$FastClassBySpringCGLIB$$2ad81e2b.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$$847aab5e.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 Cloud Connector и обычно читаю значение из application.properties.
Мой pom.xml`(имеет зависимости для весеннего загрузочного облачного коннектора и драйвера 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>
`
[ОБНОВЛЕНИЕ] согласно ответам Скотта, приведенным ниже, я рассмотрел требования к ИБП, который должен быть подключен к облачному соединителю. Так как мой - предоставляемая пользователем услуга, поэтому я не могу иметь метки и метки. Но я добавил URL-адреса JDBC. Теперь мое приложение не работает с ошибкой ниже
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
Для этого я установил "spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect"
в моем application.properties но все равно не работает
Я также проверил, что моя БД работает и настройки БД в моем экземпляре службы верны.
Ниже приведен контент моего экземпляра сервиса.
"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": []
}
]
}
`С наилучшими пожеланиями, Саурав
2 ответа
Если вы включите spring-boot-starter-cloud-connectors
в качестве зависимости, Spring Cloud Connectors попытается создать java.sql.DataSource
Боб необходимо подключить к базе данных. Соединители делают это путем поиска привязки службы, которая имеет определенные характеристики. No unique service matching interface javax.sql.DataSource found
сообщение означает, что Connectors не удалось найти привязку службы соответствующего типа.
Если вы хотите использовать Connectors, как в этом примере приложения, вам нужно будет создать предоставленный пользователем экземпляр службы с подробной информацией о соединении Postgres и связать этот экземпляр службы с приложением.
Кроме того, вы можете удалить spring-boot-starter-cloud-connectors
зависимость и вместо этого настроить соединение с базой данных, используя spring.datasource
свойства в application.yml
,
Эти параметры более подробно описаны в блоге.
Просто, чтобы подвести итог общего решения для других читателей.
Если у вас есть сценарий, в котором вы хотите, чтобы приложение с весенней загрузкой говорило с базой данных (размещенной на другом компьютере), а затем запускало приложение из облачного литейного производства. Затем следуйте некоторым советам ниже.
- После того, как вы развернете приложение Spring Boot и захотите использовать облачный соединитель Spring Boot, убедитесь, что у вас есть все необходимые зависимости в вашем classpath (spring-boot-cloud-connector и jar.
- Если вы хотите связать экземпляр службы с приложением. Убедитесь, что учетные данные соответствуют этой спецификации http://cloud.spring.io/spring-cloud-connectors/spring-cloud-cloud-foundry-connector.html
- В параметрах экземпляра службы убедитесь, что вы используете параметр uri, не зависящий от имени пользователя и пароля, для создания URI
- Убедитесь, что экземпляр вашей базы данных действительно запущен, и вы создали группы служб приложений, чтобы разрешить исходящий обмен данными из приложения облачного литейного производства. https://docs.cloudfoundry.org/concepts/asg.html
Шаги 3 и 4 были ошибками, которые я сделал. После исправления приложение отлично работает.
С наилучшими пожеланиями, Саурав