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>