복붙노트

[SPRING] Spring Boot Cloud Foundry 오류에서 고유 서비스 기계 인터페이스 오류 없음

SPRING

Spring Boot Cloud Foundry 오류에서 고유 서비스 기계 인터페이스 오류 없음

클라우드 파운드리에서 스프링 부트 애플리케이션을 실행하려면이 자습서 https://github.com/cf-platform-eng/spring-boot-cities/tree/master/cities-service를 따르려고합니다. 로컬 설치가 가능합니다.

My Spring Boot 응용 프로그램이 데이터베이스로 postgresql에 연결됩니다. 로컬 (호스트 컴퓨터)에서 실행중인 Postgresql 인스턴스에 연결하려고합니다.

내 응용 프로그램은 로컬 tomcat에 배포 된 경우 로컬로 잘 작동합니다. 하지만 bosh-lite에 응용 프로그램을 배포 할 때 "다음과 같은 오류가 발생하여 실패합니다"라는 오류가 발생합니다. 내 코드는 Maven을 사용하여 코드를 작성한다는 점을 제외하고는 튜토리얼에서 언급 한 것과 excatly 동일합니다.

    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]

포스트 그레스에 대한 내 연결이 잘 작동합니다. 그리고 스프링 클라우드 커넥터를 사용하지 않고 application.properties에서 일반적으로 값을 읽는다면 같은 앱이 잘 작동합니다.

내 pom.xml` (봄 부팅 클라우드 커넥터 및 postgresql 드라이버에 대한 종속성 있음)

<?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>

`

[최신 정보] 아래 Scott의 답변에 따라 UPS에 대한 요구 사항을 살펴 보았습니다. 클라우드 커넥터가 선택되었습니다. 따라서 고객이 제공하는 서비스이므로 태그와 라벨을 사용할 수 없습니다. 하지만 jdbc URL을 추가했습니다. 이제 내 앱이 아래 오류로 인해 실패하고 있습니다.

 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"를 설정했지만 여전히 작동하지 않습니다.

또한 내 DB가 실행 중이고 데이터베이스 인스턴스 설정이 올바른지 확인했습니다.

아래는 나의 서비스 인스턴스 내용`

"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": []
   }
  ]
 }

` 친애하는, 사우라브

해결법

  1. ==============================

    1.스프링 - 부트 - 스타터 - 클라우드 - 커넥터를 종속물로 포함하면 스프링 클라우드 커넥터는 데이터베이스에 연결하는 데 필요한 java.sql.DataSource Bean을 생성하려고 시도한다. 커넥터는 특정 특성을 갖는 서비스 Y 인딩을 찾아서이를 수행합니다. Unique service matching interface javax.sql.DataSource found 메시지는 Connectors가 해당 유형의 서비스 바인딩을 찾지 못했음을 의미합니다.

    스프링 - 부트 - 스타터 - 클라우드 - 커넥터를 종속물로 포함하면 스프링 클라우드 커넥터는 데이터베이스에 연결하는 데 필요한 java.sql.DataSource Bean을 생성하려고 시도한다. 커넥터는 특정 특성을 갖는 서비스 Y 인딩을 찾아서이를 수행합니다. Unique service matching interface javax.sql.DataSource found 메시지는 Connectors가 해당 유형의 서비스 바인딩을 찾지 못했음을 의미합니다.

    해당 샘플 응용 프로그램에서와 같이 Connector를 사용하려면 Postgres 연결의 세부 정보가있는 사용자 제공 서비스 인스턴스를 만들고 해당 서비스 인스턴스를 응용 프로그램에 바인딩해야합니다.

    또는 spring-boot-startter-cloud-connectors 종속성을 제거하고 대신 application.yml의 spring.datasource 속성을 사용하여 데이터베이스 연결을 구성 할 수 있습니다.

    이러한 옵션은 블로그 게시물에서 자세히 설명합니다.

  2. ==============================

    2.다른 독자를위한 전반적인 솔루션을 요약합니다.

    다른 독자를위한 전반적인 솔루션을 요약합니다.

    스프링 부트 응용 프로그램에서 데이터베이스 (다른 컴퓨터에서 호스팅 됨)와 대화하고 클라우드 파운드리에서 응용 프로그램을 실행하려는 시나리오가있는 경우 그런 다음 아래의 팁을 따르십시오.

    3 단계와 4 단계는 내가 한 실수였습니다. 일단 수정 응용 프로그램이 잘 작동합니다.

    친애하는, 사우라브

  3. from https://stackoverflow.com/questions/44418856/no-unique-service-maching-interface-error-in-spring-boot-cloud-foundry-error by cc-by-sa and MIT license