2016-04-03 9 views
38

Sto utilizzando Spring Boot per sviluppare due applicazioni, una funge da server e l'altra è un'app client. Tuttavia, entrambi sono la stessa app che funziona in modo diverso in base al profilo attivo. Sto usando la funzione di configurazione automatica di Spring Boot per configurare le mie applicazioni.Disabilita tutta la configurazione automatica relativa al database in Spring Boot

Desidero disattivare tutta la configurazione automatica relativa al database sull'app client, poiché non richiede la connessione al database. L'applicazione non dovrebbe provare a stabilire una connessione con il database, né tentare di utilizzare alcuna delle funzionalità Spring Data o Hibernate. L'abilitazione o disabilitazione della configurazione automatica del database deve essere condizionale e basata sul profilo attivo dell'app.

È possibile ottenere questo risultato creando due file application.properties diversi per i rispettivi profili?

Ho provato ad aggiungere questo per il mio file proprietà,

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 

Ma, l'applicazione cerca ancora di connettersi al database all'avvio. Queste esclusioni sono sufficienti per raggiungere il mio requisito?

+0

[Questo] (https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html# boot-features-external-config-profile-specific-properties) potrebbe aiutare. –

+0

Puoi rivelare il tuo codice/configurazione? – luboskrnac

+1

È inoltre possibile utilizzare i profili degli strumenti di creazione e aggiungere le dipendenze correlate ai dati solo su uno dei profili. Se il tuo pacchetto utilizza l'app con l'altro profilo, poiché non ha i pacchetti di avvio richiesti presenti nel classpath, non verrà configurato automaticamente –

risposta

26

Il modo in cui vorrei fare cosa simile è:

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

scriverne uno simile per l'applicazione del server (non esclude).

ultimo passo è quello di disattivare la configurazione automatica dalla classe principale di avvio di 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); 
    } 
} 

Cambio: @SpringBootApplication in:

@Configuration 
@ComponentScan 

Questo dovrebbe fare il lavoro. Ora, le dipendenze che ho escluso nell'esempio potrebbero essere incomplete. Erano abbastanza per me, ma non sono sicuro che sia tutto per disabilitare completamente le librerie relative ai database. Controllare l'elenco qui sotto per essere sicuri:

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

Speranza che aiuta,

+1

'@ SpringBootApplication' ha una proprietà' exclude', non c'è bisogno di 'ClientAppConfiguration' . –

+0

È possibile eseguire tale esclusione del condizionale in base al profilo attivo senza utilizzare ClientAppConfiguration? – patrykos91

+0

Sì. Escludere in '@ SpringBootApplication', e quindi nel pacchetto specifico, creare una classe' @ Configuration' che esegue un '@Import' delle classi rilevanti e dipende da' @ Profile' o '@ Conditional'. In questo modo, puoi testare ogni livello dell'applicazione senza che l'autoconfig si diffonda in tutta l'app. Vuoi testare il DB? Basta scansionare il pacchetto DB, configurare un DB fittizio e sei a posto. –

12

Sembra come hai appena dimenticato la virgola per separare le classi. Quindi, in base alla configurazione del proceda in questo modo:

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 

In alternativa si potrebbe anche definire come segue:

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 
6

via d'uscita per me è stato quello di aggiungere

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

annotazione di classe in esecuzione Spring boot (contrassegnato con `@SpringBootApplication).

Infine, sembra che:

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

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

Per disabilitare la configurazione automatica e uscire tutto il database correlati da:

Impossibile determinare database incorporato classe di driver per il tipo di database NESSUNO

1. Uso dell'annotazione:

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

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

2. Application.properties Uso:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration 
+1

Grazie mille. Ho provato la seconda opzione. ha funzionato come previsto. – Krish

0

mi è stato sempre questo errore, anche se ho fatto tutte le soluzioni di cui sopra.

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

Ad un certo punto, quando guardo il POM c'era questa dipendenza in esso

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

E la classe Pojo erano le seguenti importazioni

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

che mostra chiaramente la l'applicazione si aspettava un'origine dati.

Quello che ho fatto è stato ho rimosso la dipendenza da APP pom e sostituito le importazioni per il POJO con il seguente volta

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

Infine ho ottenuto generazione corretta. Dai un'occhiata potresti aver incontrato lo stesso problema

Problemi correlati