Cấu hình mặc định trong Spring 3.1


100

Trong ứng dụng của tôi, tôi có các hạt đậu được chú thích bằng @Profile("prod")@Profile("demo"). Cái đầu tiên, như bạn có thể đoán :), được sử dụng trên các bean kết nối với production DB và cái thứ hai chú thích các bean sử dụng một số DB giả ( HashMaphoặc bất cứ thứ gì) - để giúp phát triển nhanh hơn.

Những gì tôi muốn có là profile mặc định ( "prod") sẽ luôn được sử dụng nếu nó không bị ghi đè bởi " something-else ".

Hoàn hảo sẽ có trong web.xml:

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>prod</param-value>
</context-param>

và sau đó ghi đè điều này bằng -Dspring.profiles.active="demo"để tôi có thể làm:

mvn jetty:run -Dspring.profiles.active="demo". 

Nhưng đáng buồn là điều này không hoạt động. Bất kỳ ý tưởng làm thế nào tôi có thể đạt được điều đó? Đặt -Dspring.profiles.active="prod"trên tất cả các môi trường của tôi không phải là một tùy chọn.

Câu trả lời:


67

Kinh nghiệm của tôi là sử dụng

@Profile("default")

bean sẽ chỉ được thêm vào ngữ cảnh nếu không có cấu hình nào khác được xác định. Nếu bạn vượt qua một hồ sơ khác, ví dụ -Dspring.profiles.active="demo", hồ sơ này sẽ bị bỏ qua.


4
Câu trả lời được chấp nhận phụ thuộc vào web.xml (và điều đó là tốt), nhưng câu trả lời này hoạt động cho dù bạn có web.xml hay không và do đó, nó hữu ích hơn cho mọi người.
Jay

1
giải pháp này là nhiều bụi
cahen

Đây là một tính năng chính thức hay một số tác dụng phụ? Bạn có muốn liên kết đến tài liệu Spring nơi mô tả tính năng này không?
gỉ

111

Xác định môi trường sản xuất của bạn làm cấu hình mặc định trong web.xml của bạn

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>prod</param-value>
</context-param>

và nếu bạn muốn sử dụng một cấu hình khác, hãy chuyển nó làm thuộc tính hệ thống

mvn -Dspring.profiles.active="demo" jetty:run

3
Không, anh ấy đã cố gắng xác định hồ sơ hoạt động trong web.xml và là thuộc tính hệ thống. Trong giải pháp của mình, tôi định cấu hình cấu hình mặc định trong web.xml và ghi đè / xác định cấu hình hoạt động thông qua thuộc tính hệ thống. Nếu không có hồ sơ hoạt động rõ ràng , mặc định sẽ được sử dụng.
andih

1
Cảm ơn! đây chính xác là những gì tôi muốn! không thể tìm thấy nó ở bất cứ đâu: /
Michał Margiel

Một vấn đề với cách tiếp cận này: nếu bạn thiết lập spring.profiles.default=prodtrong application.properties, sau đó application-prod.propertiessẽ không được nạp. Điều này là phản trực quan.
gamliela,

@gamliela Phương pháp này không đặt cấu hình mặc định trong application.propertiestệp. Để biết điều đó application-prod.propertiesnên được sử dụng, bạn sẽ phải biết hồ sơ. Đó là những gì cách tiếp cận này làm. Nó xác định các cấu hình bên ngoài ngữ cảnh mùa xuân hoặc là web.xml(mặc định) hoặc thông qua biến môi trường (ghi đè mặc định).
andih

@andih Vâng, tôi biết điều đó, nhưng tôi chỉ nói rằng nó không trực quan và do đó có vấn đề. Kể từ khi application-default.propertiesđược tải, tôi cũng mong đợi điều đó application-newdefault.propertiescũng sẽ được tải. Nó không phải là một vấn đề với giải pháp của bạn, đó là một vấn đề với mùa xuân ...
gamliela

6

Tôi gặp vấn đề tương tự, nhưng tôi sử dụng WebApplicationInitializer để định cấu hình ServletContext theo chương trình (Servlet 3.0+). Vì vậy, tôi làm như sau:

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        // Create the 'root' Spring application context
        final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        // Default active profiles can be overridden by the environment variable 'SPRING_PROFILES_ACTIVE'
        rootContext.getEnvironment().setDefaultProfiles("prod");
        rootContext.register(AppConfig.class);

        // Manage the lifecycle of the root application context
        sc.addListener(new ContextLoaderListener(rootContext));
    }
}

5

Bạn cũng có thể xem xét xóa cấu hình PROD và sử dụng @Profile ("! Demo")


2
Tôi cho rằng điều này sẽ không hoạt động trong trường hợp bạn có nhiều hơn hai hồ sơ, phải không?
Chop

3

Giới thiệu về thiết lập hồ sơ sản xuất mặc định đã được đăng @andih

Cách dễ nhất để đặt cấu hình mặc định cho plugin maven jetty là bao gồm phần tử bên dưới trong cấu hình plugin của bạn:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <configuration>
        <systemProperties>
            <systemProperty>
                <name>spring.profiles.active</name>
                <value>demo</value>
            </systemProperty>
        </systemProperties>
    </configuration>
</plugin>

3

Spring cung cấp hai thuộc tính riêng biệt khi xác định cấu hình nào đang hoạt động:

  • spring.profiles.active

  • spring.profiles.default

Nếu spring.profiles.activeđược đặt, thì giá trị của nó xác định cấu hình nào đang hoạt động. Nhưng nếu spring.profiles.activekhông được thiết lập, thì mùa xuân sẽspring.profiles.default.

Nếu không spring.profiles.activehoặc không spring.profiles.defaultđược đặt, thì sẽ không có hồ sơ hoạt động và chỉ những hạt đậu không được xác định là nằm trong hồ sơ được tạo. Bất kỳ hạt đậu nào không chỉ định hồ sơ sẽ thuộc về defaulthồ sơ.


-1

Bạn có thể thiết lập web.xml của mình dưới dạng tài nguyên đã lọc và có giá trị này được điền bởi maven từ cài đặt hồ sơ maven - đó là những gì chúng tôi làm.

trong pom lọc tất cả các tài nguyên (bạn có thể thực hiện taht nếu không có dấu $ {} trong đó)

<webResources>
    <resource>
        <directory>src/main/webapp</directory>
        <filtering>true</filtering>
    </resource>
</webResources>

trong web.xml đặt

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>${spring.prfile}</param-value>
</context-param>

trong pom tạo hồ sơ maven

<profiles>
    <profile>
        <id>DEFAULT</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profile>prod</spring.profile>
        </properties>
    <profile>
    <profile>
        <id>DEMO</id>
        <properties>
            <spring.profile>demo</spring.profile>
        </properties>
    <profile>
</profiles>

Bây giờ bạn có thể sử dụng

mvn jetty:run -P DEMO

hoặc đơn giản -P DEMOvới bất kỳ lệnh maven nào


1
Tôi không chắc lắm nhưng tôi nghĩ điều đó sẽ không hiệu quả. Cầu cảng IMHO: chạy sẽ không chạy trong giai đoạn tài nguyên được lọc.
Michał Margiel

của caurse bạn cần chạy mvn clean compile jetty: run -P DEMO, nhưng với mã chưa biên dịch, nó chạy tự động
Hurda

10
Tôi hiểu rằng một trong những mục tiêu chính của Hồ sơ Spring 3.1 là tạo một tệp WAR duy nhất sẵn sàng để triển khai trong mọi môi trường. Sử dụng hồ sơ Maven là một bước trở lại trạng thái trước đó: nơi bao bì của một tập tin WAR là cần thiết cho từng môi trường ...
edrabc

@edrabc anh ấy đang hỏi cầu cảng mvn: run - không có tệp WAR.
Hurda

Đồng ý @Hurda. Nhưng anh ta cũng yêu cầu chạy lệnh trong nhiều môi trường: có sự kết hợp giữa Hồ sơ Maven và Hồ sơ mùa xuân có thể gây hiểu nhầm một chút ...
edrabc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.