Desative todas as configurações automáticas relacionadas ao banco de dados no Spring Boot

115

Estou usando o Spring Boot para desenvolver dois aplicativos, um serve como servidor e o outro é um aplicativo cliente. No entanto, ambos são o mesmo aplicativo que funcionam de maneira diferente com base no perfil ativo. Estou usando o recurso de configuração automática do Spring Boot para configurar meus aplicativos.

Eu quero desabilitar toda a configuração automática relacionada ao banco de dados no aplicativo cliente, uma vez que não exigirá conexão com o banco de dados. A aplicação não deve tentar estabelecer conexão com o banco de dados, nem tentar usar qualquer um dos recursos do Spring Data ou Hibernate. A ativação ou desativação da configuração automática do banco de dados deve ser condicional e baseada no perfil ativo do aplicativo.

Posso conseguir isso criando dois arquivos application.properties diferentes para os respectivos perfis?

Tentei adicionar isso ao meu arquivo de propriedades,

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration\
  org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration\
  org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration

Porém, o aplicativo ainda tenta se conectar ao banco de dados na inicialização. Essas exclusões são suficientes para cumprir meu requisito?

yuva
fonte
Isso pode ajudar.
Rahul Sharma
Você pode divulgar seu código / configuração?
luboskrnac,
2
Você também pode usar seus perfis de ferramenta de construção e adicionar as dependências relacionadas a dados apenas em um de seus perfis. Se seu aplicativo empacotar seu aplicativo usando outro perfil, já que não possui os pacotes iniciais necessários presentes no caminho de classe, ele não será configurado automaticamente
Ali Dehghani

Respostas:

99

A maneira como eu faria algo semelhante é:

@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@Profile ("client_app_profile_name")
public class ClientAppConfiguration {
    //it can be left blank
}

Escreva um semelhante para o aplicativo de servidor (sem exclusões).

A última etapa é desativar a configuração automática da classe principal de inicialização de primavera:

@SpringBootApplication
public class SomeApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(SomeApplication.class);
    }

    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SomeApplication.class);
    }
}

Mudar: @SpringBootApplicationpara:

@Configuration 
@ComponentScan

Isso deve fazer o trabalho. Agora, as dependências que excluí no exemplo podem estar incompletas. Eles foram suficientes para mim, mas eu não tenho certeza se é tudo para desativar completamente as bibliotecas relacionadas ao banco de dados. Verifique a lista abaixo para ter certeza:

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#auto-configuration-classes

espero que ajude

patrykos91
fonte
5
@SpringBootApplicationtem uma excludepropriedade, não há necessidade de ClientAppConfiguration.
Abhijit Sarkar
Você pode fazer isso excluir condicional com base no perfil ativo sem usar ClientAppConfiguration?
patrykos91
1
Sim. Você excluiria no @SpringBootApplicatione, em seguida, no pacote específico, criaria uma @Configurationclasse que faz uma @Importdas classes relevantes e é dependente de @Profileou @Conditional. Dessa forma, você pode testar cada camada do aplicativo sem que o autoconfig vaze para todo o aplicativo. Quer testar o DB? Basta escanear o pacote de banco de dados, configurar um banco de dados fictício e pronto.
Abhijit Sarkar
89

Para desativar toda a configuração automática relacionada ao banco de dados e sair de:

Não é possível determinar a classe do driver de banco de dados incorporado para o tipo de banco de dados NENHUM

1. Usando anotação:

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(PayPalApplication.class, args);
    }
}

2. Usando Application.properties:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
Jorge López
fonte
o uso de Application.properties com Spring Boot 2+ é preferível à anotação.
Gustavo Rodrigues
@GustavoRodrigues você pode compartilhar alguma documentação para apoiar sua declaração? Obrigado!
Betlista
27

Parece que você esqueceu a vírgula para separar as classes. Portanto, com base na sua configuração, o seguinte funcionará:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration

Alternativamente, você também pode defini-lo da seguinte maneira:

spring.autoconfigure.exclude[0]=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
spring.autoconfigure.exclude[1]=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
spring.autoconfigure.exclude[2]=org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
spring.autoconfigure.exclude[3]=org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
Julien May
fonte
17

Existe uma maneira de excluir classes específicas de autoconfiguração usando @SpringBootApplicationanotação.

@Import(MyPersistenceConfiguration.class)
@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class, 
        DataSourceTransactionManagerAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class})
public class MySpringBootApplication {         
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}

@SpringBootApplication#excludeattribute é um apelido para @EnableAutoConfiguration#excludeattribute e acho que é bastante prático e útil.
Eu adicionei @Import(MyPersistenceConfiguration.class)ao exemplo para demonstrar como você pode aplicar sua configuração de banco de dados personalizada.

naXa
fonte
2
Obrigado! Esta é a resposta mais moderna. Vinculado a ele aqui: konstructcomputers.blogspot.com/2018/10/…
Joshua Davis
9

A saída para mim foi adicionar

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})

anotação para classe executando Spring boot (marcada com `@SpringBootApplication).

Finalmente, parece:

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application{

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
 }
Ryzhman
fonte
7

Outra forma de controlá-lo por meio de Perfis é esta:

// note: no @SpringApplication annotation here
@Import(DatabaseConfig.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@Configuration
@Import({DatabaseConfig.WithDB.class, DatabaseConfig.WithoutDB.class})
public class DatabaseConfig {

    @Profile("!db")
    @EnableAutoConfiguration(
            exclude = {DataSourceAutoConfiguration.class,   DataSourceTransactionManagerAutoConfiguration.class,
                HibernateJpaAutoConfiguration.class})
    static class WithoutDB {

    }

    @Profile("db")
    @EnableAutoConfiguration
    static class WithDB {

    }
}
Dirk
fonte
Você pode me dizer como colocar um logger dentro da classe WithoutDB e WithDB para que, quando eu iniciar o aplicativo, imprima alguma mensagem. Obrigado
ankur pramanik
2

Tive o mesmo problema aqui, resolvido assim:

Basta adicionar outro em application-{yourprofile}.ymlque "seu perfil" possa ser "cliente".

No meu caso, eu só queria remover o Redis em um perfil Dev, então adicionei um application-dev.ymlpróximo ao principal application.ymle ele fez o trabalho.

Neste arquivo eu coloquei:

spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration

isso deve funcionar com arquivos de propriedades também.

Gosto do fato de não haver necessidade de alterar o código do aplicativo para fazer isso.

Sylvain
fonte
0

Eu estava recebendo esse erro mesmo se tivesse feito todas as soluções mencionadas acima.

 by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfig ...

Em algum momento, quando procuro o POM, havia essa dependência nele

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

E a classe Pojo teve as seguintes importações

import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id;

O que mostra claramente que o aplicativo esperava uma fonte de dados.

O que fiz foi remover a dependência JPA do pom e substituir as importações do pojo pelo seguinte uma vez

import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document;

Finalmente consegui construir com SUCESSO. Verifique se você pode ter encontrado o mesmo problema

Tadele Ayelegn
fonte
Esta não é uma solução para o problema discutido. O problema não é remover o suporte JPA do aplicativo, mas sim habilitá-lo / desabilitá-lo com base em uma condição (como um perfil Spring) - sem alterar o código ou a configuração do projeto Maven. Você estava recebendo o erro relacionado à origem de dados porque, aparentemente, você se esqueceu de definir e ativar o perfil Spring que carregaria a configuração "no-datasource" em vez de carregar as classes relacionadas ao DS / JPA. As bibliotecas JPA ainda devem permanecer na distribuição.
cvnew
1
Eu não acho que você leu meu post completamente. Na última linha, estou sugerindo que pode ser um problema semelhante, mas não estou dizendo que essa é a resposta
Tadele Ayelegn
0

Eu adiciono myApp.java, após @SpringBootApplication

@EnableAutoConfiguration (exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})

E mudou

@SpringBootApplication => @Configuration

Então, eu tenho isso na minha classe principal (myApp.java)

package br.com.company.project.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class SomeApplication {

public static void main(String[] args) {
    SpringApplication.run(SomeApplication.class, args);
}

}

E trabalhe para mim! =)

Cássia Chagas
fonte