[RESOLVIDO] Spring-boot - erro em configuração de conexão ('url' attribute is not specified)

Pessoal, estou desenvolvendo uma API REST e estou com um pequeno grande problema (rs) para configurar a conexão no banco de dados.

No começo estava fazendo pelo application.properties e estava dando tudo certo.

spring.datasource.url=jdbc:oracle:thin:@endereco:1521/NOMEDOSERVICO
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.format_sql=false

Porém há um detalhe: preciso conectar na base de acordo com o ambiente de execução. Aqui no trabalho temos três (desenvolvimento/homologação/produção) onde são identificadas por uma variável de ambiente. Então não consegui pensar em outra forma senão configurar esta conexão através de uma classe @Configuration.

Para ver a funcionalidade, tirei os dados do application.properties e joguei na classe abaixo.

package br.org.trampo.database.config;

import javax.sql.DataSource;

import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import br.gov.sp.saobernardo.enums.ConexEnum;

@Configuration
public class DataSourceConfig {
    
    @Bean
    public DataSource getDataSource() {
                return     DataSourceBuilder.create()
                                    .driverClassName("oracle.jdbc.driver.OracleDriver")    
                                    .url("jdbc:oracle:thin:@endereco:1521/NOMEDOSERVICO")
                                    .username("username")
                                    .password("password")
                                    .build();
    }
}

Porém ao inicializar com mvn spring-boot:run, ele retorna o seguinte erro:

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
        If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
        If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

O que dá a entender é que ao inicializar o spring ignora esta classe criada. Já que quando coloquei de volta os dados de conexão no application.properties, a aplicação iniciou normalmente.

Precisa de alguma coisa (por exemplo, especificar que classe está sendo usada como configuração na classe Application) para o spring passar pela classe de configuração?

Ah, o pom.xml é este:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">

	<modelVersion>4.0.0</modelVersion>
	<groupId>br.org.trampo</groupId>
	<artifactId>aplicacao-rest</artifactId>
	<version>1.0.0</version>
	<name>aplicacao-rest</name>
	<description>Aplicação de integração entre sistemas do Municipio de São Bernardo do Campo com APIs bancárias de Ficha de Compensação.</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.6.RELEASE</version>
		<relativePath />
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>com.squareup.okhttp3</groupId>
			<artifactId>okhttp</artifactId>
			<version>4.2.0</version>
		  </dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.junit.jupiter</groupId>
			<artifactId>junit-jupiter-api</artifactId>
			<version>5.2.0</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.10.3</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.10.3</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>2.10.3</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>	
		<!-- https://mvnrepository.com/artifact/oracle/ojdbc6 -->
		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>11.2.0.3</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<optional>true</optional>
		</dependency>
        <dependency>
			<groupId>org.webjars</groupId>
			<artifactId>bootstrap</artifactId>
			<version>3.3.7</version>
		</dependency>
        <dependency>
            <groupId>net.sourceforge.nekohtml</groupId>
            <artifactId>nekohtml</artifactId>
            <version>1.9.21</version>
        </dependency>
        <dependency>
            <groupId>javax.faces</groupId>
            <artifactId>javax.faces-api</artifactId>
            <version>2.3</version>
            <scope>provided</scope>
        </dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<mainClass>br.org.trampo.aplicacao.IntegracaoFichaCompensacaoApplication
					</mainClass>
				</configuration>
			</plugin>			
		</plugins>
	</build>

</project>

Cria arquivos properties separados, um para cada ambiente, de acordo com o ambiente você seleciona um profile.

application.properties //Configurações comuns em todos os ambientes
application-dev.properties //Configurações do ambiente de desenvolvimento
application-hml.properties //Configuração do ambiente de homologação
application-prd.properties //Configurações do ambiente de produção

Certo, mas onde eu faço a seleção do profile?

Tu passa um parâmetro informando qual o profile quer executar!

Exemplo:

-Dspring.profiles.active=dev //Para o ambiente de desenvolvimento
-Dspring.profiles.active=hml //Para o ambiente de homologação
-Dspring.profiles.active=prd //Para o ambiente de produção

Tendo como base sempre o nome do profile definido na nomenclatura do arquivo properties.

1 curtida

@Jonathan_Medeiros, muito obrigado! Ajudou demais!