2016-02-07 20 views
5

Tôi đã một ứng dụng khởi động mùa xuân với hồ sơ thiết lập khác nhau: dev, prod, qc, console, vvCấu hình khởi động mùa xuân bỏ đăng ký trên nhiều @Profile

Các lớp cấu hình hai được thiết lập như sau. MyConfigurationA phải được đăng ký cho tất cả hồ sơ ngoại trừ console. MyConfigurationB phải được đăng ký ngoại trừ consoledev.

Khi tôi chạy ứng dụng có tiểu sử console, số MyConfigurationA không được đăng ký - điều đó là tốt. Nhưng MyConfigurationB được đăng ký - mà tôi không muốn. Tôi đã thiết lập chú thích @Profile như sau để không đăng ký MyConfigurationB cho cấu hình consoledev.

Nhưng MyConfigurationB đang được đăng ký khi tôi chạy ứng dụng có tiểu sử console.

@Profile({ "!" + Constants.PROFILE_CONSOLE , "!" + Constants.PROFILE_DEVELOPMENT }) 

Các tài liệu (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Profile.html) có một ví dụ về trong đó có một hồ sơ cá nhân và loại trừ người kia. Trong ví dụ của tôi Tôi không bao gồm cả hai như @Profile({"!p1", "!p2"}):

@Profile ({ "p1", "! P2"}), đăng ký sẽ xảy ra nếu hồ sơ 'p1' đang hoạt động HOẶC nếu hồ sơ 'p2' không hoạt động.

Câu hỏi của tôi là: Làm cách nào để bỏ qua đăng ký cấu hình của cả hai cấu hình? @Profile({"!p1", "!p2"}) đang thực hiện HOẶC hoạt động. Chúng tôi cần AND hoạt động ở đây.


Mã:

@Configuration 
@Profile({ "!" + Constants.PROFILE_CONSOLE }) 
public class MyConfigurationA { 
    static{ 
     System.out.println("MyConfigurationA registering..."); 
    } 
} 

@Configuration 
@Profile({ "!" + Constants.PROFILE_CONSOLE , "!" + Constants.PROFILE_DEVELOPMENT }) // doesn't exclude both, its OR condition 
public class MyConfigurationB { 
    static{ 
     System.out.println("MyConfigurationB registering..."); 
    } 
} 

public final class Constants { 
    public static final String PROFILE_DEVELOPMENT = "dev"; 
    public static final String PROFILE_CONSOLE = "console"; 
    ... 
} 

Trả lời

8

@Profile({"!console", "!dev"}) phương tiện (KHÔNG ủi) HOẶC (KHÔNG dev) là đúng nếu bạn chạy ứng dụng của bạn với cấu hình 'console'.
Để giải quyết điều này, bạn có thể tạo ra một tùy chỉnh Condition:

public class NotConsoleAndDevCondition implements Condition { 
    @Override 
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
     Environment environment = context.getEnvironment(); 
     return !environment.acceptsProfiles("console", "dev"); 
    } 
} 

Và áp dụng tình trạng này thông qua @Conditional chú thích để Configuration:

@Conditional(NotConsoleAndDevCondition.class) 
public class MyConfigurationB { 
+0

Đúng vậy !! Cảm ơn.. – gtiwari333

Các vấn đề liên quan