2013-03-05 10 views
5

Tôi có hai hạt. Cả hai đều thực hiện chức năng gửi thư. Một là chỉ làm việc khi nó được triển khai đến một máy chủ ứng dụng. Một cái khác được sử dụng để thử nghiệm.Dây mặc định mùa xuân với Hồ sơ

Chúng tôi có tiểu sử cho từng nhà phát triển và môi trường. Tôi muốn nối dây thử nghiệm chỉ khi thực sự thử nghiệm. Các hạt khác nên được sử dụng khi không thử nghiệm. Làm thế nào tôi có thể lưu trữ này?

@Component 
@Profile("localtest") 
public class OfflineMail implements Mailing {} 

Giải pháp tiếp cận:

Sử dụng "mặc định" Tôi đọc ở đâu đó, nhưng có vẻ là không có mùa thu trở lại để "mặc định" cho một hồ sơ như "dev":

@Component 
@Profile("default") 
public class OnlineMail implements Mailing {} 

-> Ngoại lệ cho không có đậu cho hệ thống dây điện được tìm thấy.

Rời hồ sơ cá nhân ra:

@Component 
public class OnlineMail implements Mailing {} 

-> Ném một ngoại lệ duy nhất khi chạy hồ sơ cá nhân "localtest".

Thêm tất cả các cấu:

@Component 
@Profile("prod") 
@Profile("integration") 
@Profile("test") 
@Profile("dev1") 
@Profile("dev2") 
@Profile("dev3") 
... 
public class OnlineMail implements Mailing {} 

này được thực sự làm việc, tuy nhiên các nhà phát triển của chúng tôi không được đánh số họ sử dụng "dev <WindowsLogin>" và thêm các cấu hình, có thể làm việc cho một đậu, nhưng người ta sẽ nhận được gặp rắc rối khi sử dụng nó cho một số đậu vì điều này chắc chắn trở nên xấu xí.

Sử dụng một cái gì đó như @Profile ("! Localtest") dường như không hoạt động tốt.

Có ai biết cách tốt hơn để có được "dây theo mặc định nếu không tìm thấy hạt cụ thể" không?

+0

'@ Component' mà không' @ Profile' phải là đậu mặc định, nếu không có gì là có dây. Bạn đã cố gắng để tránh ngoại lệ duy nhất với tên thiết lập cho thành phần? Ý tôi là, '@Component (" mail ")' với '@Profile (" localtest ")' và không có nó? – n1ckolas

Trả lời

5

Cuối cùng tôi đã tìm thấy một giải pháp dễ dàng.

Thư trực tuyến chỉ được kết nối theo mặc định.

@Component 
public class OnlineMail implements Mailing {} 

Chú thích thư ngoại tuyến được ưu tiên hơn OnlineMail và tránh ngoại lệ duy nhất.

@Component 
@Profile("localtest") 
@Primary 
public class OfflineMail implements Mailing {} 
2

Hãy thử điều này:

@Component 
@Profile("production") 
public class OnlineMail implements Mailing {} 

@Component 
@Profile("localtest") 
public class OfflineMail implements Mailing {} 

Sau đó chạy thử nghiệm sử dụng @ActiveProfiles ("localtest") và chạy môi trường sản xuất sử dụng "sản xuất" như DEFAULT hồ sơ.

Ngoài ra tôi hy vọng trong phiên bản tiếp theo của mùa xuân ActiveProfilesResolver sẽ được giới thiệu SPR-10338 - nó có thể hữu ích cho bạn (để tránh "dev1", "dev2" vv).

+0

Tôi không nhận được điểm cho giải pháp này. Chúng tôi đang thiết lập môi trường chính xác ở mọi nơi, nơi chúng tôi triển khai ứng dụng. Vì vậy, Spring không nên tải mặc định, phải không? Và tôi không chắc chắn về cách tách mặc định để thử nghiệm vì tài nguyên sản xuất cũng sẽ nằm trong tệp thử nghiệm của chúng tôi. –

+0

Có hai loại hồ sơ - mặc định

+0

Vì vậy, tốt hơn là tránh sử dụng mặc định (trống) hồ sơ mùa xuân cho bất kỳ đậu nào đã có mô hình - sử dụng hồ sơ "sản xuất" và "localtest". Và khi bắt đầu, hãy chọn bắt buộc - sử dụng @ActiveProfiles để kiểm tra và 'pring.profiles.default' or'pring.profiles.active 'cho máy chủ –

0

Xuân hỗ trợ tiêm Bean bởi @Profile rất tốt:

interface Talkative { 
    String talk(); 
} 

@Component 
@Profile("dev") 
class Cat implements Talkative { 
     public String talk() { 
     return "Meow."; 
    } 
} 

@Component 
@Profile("prod") 
class Dog implements Talkative { 
    public String talk() { 
     return "Woof!"; 
    } 
} 

trình trong đơn vị kiểm tra

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:applicationContex-test.xml"}) 
@ActiveProfiles(value = "dev") 
public class InjectByDevProfileTest 
{ 
    @Autowired 
    Talkative talkative; 

    @Test 
    public void TestTalkative() { 
     String result = talkative.talk(); 
     Assert.assertEquals("Meow.", result); 

    } 
} 

trình trong Main():

@Component công cộng lớp học chính {

 public static void main(String[] args) { 
      // Enable a "dev" profile 
      System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "dev"); 
      ApplicationContext context = 
        new ClassPathXmlApplicationContext("applicationContext.xml"); 
      Main p = context.getBean(Main.class); 
      p.start(args); 
     } 

     @Autowired 
     private Talkative talkative; 

     private void start(String[] args) { 
      System.out.println(talkative.talk()); 
     } 
    } 

Kiểm tra này cho mã Demo: https://github.com/m2land/InjectByProfile