Spring Boot에서 모든 데이터베이스 관련 자동 구성 비활성화


115

저는 Spring Boot를 사용하여 두 개의 애플리케이션을 개발하고 있는데, 하나는 서버 역할을하고 다른 하나는 클라이언트 앱입니다. 그러나 둘 다 활성 프로필에 따라 다르게 작동하는 동일한 앱입니다. 내 애플리케이션을 구성하기 위해 Spring Boot의 자동 구성 기능을 사용하고 있습니다.

데이터베이스 연결이 필요하지 않으므로 클라이언트 앱에서 모든 데이터베이스 관련 자동 구성을 비활성화하고 싶습니다. 애플리케이션은 데이터베이스와의 연결을 설정하거나 SpringData 또는 Hibernate 기능을 사용하려고 시도해서는 안됩니다. 데이터베이스 자동 구성의 활성화 또는 비활성화는 조건부이며 앱의 활성 프로필을 기반으로해야합니다.

각 프로필에 대해 두 개의 서로 다른 application.properties 파일을 만들어이를 수행 할 수 있습니까?

나는 이것을 내 속성 파일에 추가하려고 시도했습니다.

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

그러나 응용 프로그램은 시작시 데이터베이스에 연결을 시도합니다. 이러한 예외가 내 요구 사항을 충족하는 데 충분합니까?


도움 될 수 있습니다.
Rahul Sharma

코드 / 구성을 공개 할 수 있습니까?
luboskrnac

2
빌드 도구 프로필을 사용하고 프로필 중 하나에 만 데이터 관련 종속성을 추가 할 수도 있습니다. 패키지는 필요한 스타터 패키지는 클래스 경로에 존재하지 않았기 때문에, 다른 프로파일을 사용하여 응용 프로그램, 그것은 자동으로 구성되지 않을 경우
알리 Dehghani을

답변:


99

비슷한 일을하는 방법은 다음과 같습니다.

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

서버 앱에 대해 유사한 것을 작성하십시오 (제외 제외).

마지막 단계는 메인 스프링 부트 클래스에서 자동 구성을 비활성화하는 것입니다.

@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);
    }
}

변경 : 다음 @SpringBootApplication으로 :

@Configuration 
@ComponentScan

이것은 일을해야합니다. 이제 예제에서 제외한 종속성이 불완전 할 수 있습니다. 나에게는 충분했지만 데이터베이스 관련 라이브러리를 완전히 비활성화하는 것이 확실하지 않습니다. 아래 목록을 확인하십시오.

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

도움이되는 희망


5
@SpringBootApplicationexclude속성 이 있으며 ClientAppConfiguration.
Abhijit Sarkar

ClientAppConfiguration을 사용하지 않고 활성 프로필을 기반으로 조건부 제외를 수행 할 수 있습니까?
patrykos91

1
예. 에서 제외 @SpringBootApplication하고 특정 패키지 에서 관련 클래스를 수행하고 또는에 종속 되는 @Configuration클래스를 만듭니다 . 이렇게하면 자동 구성이 앱 전체에서 유출되지 않고 각 애플리케이션 계층을 테스트 할 수 있습니다. DB를 테스트하고 싶습니까? DB 패키지를 스캔하고 모의 DB를 구성하기 만하면됩니다. @Import@Profile@Conditional
Abhijit Sarkar

89

모든 데이터베이스 관련 자동 구성을 비활성화하고 다음에서 종료합니다.

데이터베이스 유형 NONE에 대한 임베디드 데이터베이스 드라이버 클래스를 판별 할 수 없습니다.

1. 주석 사용 :

@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 사용 :

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

주석보다 Spring Boot 2+와 함께 Application.properties를 사용하는 것이 좋습니다.
Gustavo Rodrigues

@GustavoRodrigues 당신의 진술을 뒷받침하는 몇 가지 문서를 공유 할 수 있습니까? 감사!
Betlista

27

클래스를 구분하기 위해 쉼표를 잊어 버린 것 같습니다. 따라서 구성에 따라 다음이 작동합니다.

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

또는 다음과 같이 정의 할 수도 있습니다.

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

17

@SpringBootApplication주석을 사용하여 특정 자동 구성 클래스를 제외하는 방법이 있습니다 .

@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는 속성의 별칭이며 @EnableAutoConfiguration#exclude오히려 편리하고 유용합니다. 사용자 지정 데이터베이스 구성을 적용하는 방법을 보여주기 위해 예제에
추가 @Import(MyPersistenceConfiguration.class)했습니다.


2
감사! 이것은 가장 현대적인 대답입니다. 여기에 링크 : konstructcomputers.blogspot.com/2018/10/...
조슈아 데이비스

9

나를위한 방법은

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

Spring boot를 실행하는 클래스에 대한 주석 (`@SpringBootApplication으로 표시됨).

마지막으로 다음과 같습니다.

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

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

7

프로필을 통해 제어하는 ​​또 다른 방법은 다음과 같습니다.

// 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 {

    }
}

응용 프로그램을 시작할 때 일부 메시지를 인쇄하도록 WithoutDB 및 WithDB 클래스에 로거를 넣는 방법을 알려 주시겠습니까? 감사합니다
ankur pramanik

2

나는 여기에 같은 문제가 있었고 다음과 같이 해결되었습니다.

그냥 추가하세요 application-{yourprofile}.yml"yourprofile"이 "client"일 수있는 위치를 .

제 경우에는 Dev 프로필에서 Redis를 제거하고 싶었 기 때문에 application-dev.yml메인application.yml 하고 작업을 수행했습니다.

이 파일에 다음을 넣습니다.

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

이것은 속성 파일에서도 작동합니다.

이를 위해 애플리케이션 코드를 변경할 필요가 없다는 사실이 마음에 듭니다.


0

위에서 언급 한 모든 솔루션을 수행 한 경우에도이 오류가 발생했습니다.

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

어떤 시점에서 POM을 찾을 때이 종속성이있었습니다.

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

그리고 Pojo 클래스에는 다음과 같은 수입품이 있습니다.

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

애플리케이션이 데이터 소스를 예상하고 있음을 분명히 보여줍니다.

내가 한 일은 pom에서 JPA 종속성을 제거하고 pojo에 대한 가져 오기를 다음으로 한 번 바꿨습니다.

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

마침내 성공적인 빌드를 얻었습니다. 동일한 문제가 발생했을 수 있는지 확인하십시오.


이것은 논의 된 문제에 대한 해결책이 아닙니다. 문제는 애플리케이션에서 JPA 지원을 모두 제거하는 것이 아니라 코드 또는 Maven 프로젝트 구성을 변경하지 않고 조건 (예 : Spring 프로필)에 따라 활성화 / 비활성화하는 것입니다. DS / JPA 관련 클래스를로드하는 대신 "no-datasource"구성을로드하는 Spring 프로필을 정의하고 활성화하는 것을 잊었 기 때문에 데이터 소스 관련 오류가 발생했습니다 . JPA 라이브러리는 여전히 배포판에 남아 있어야합니다.
cvnew

1
내 게시물을 완전히 읽지 않은 것 같습니다. 마지막 줄에서 나는 그것이 유사한 문제일지도 모른다고 제안하고 있지만 그것이 답이라고 말하지는 않는다
Tadele Ayelegn

0

@SpringBootApplication 다음에 myApp.java에 추가합니다.

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

그리고 변경

@SpringBootApplication => @Configuration

그래서 내 메인 클래스 (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);
}

}

그리고 나를 위해 일하십시오! =)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.