2013-03-05 10 views
5

私は2つの豆を持っています。どちらもメール機能を実装しています。アプリケーションサーバーにデプロイされている場合にのみ動作します。もう1つはテストに使用されます。プロファイル付きのスプリングデフォルト配線

私たちは、開発者と環境ごとのプロファイルを持っています。実際にテストするときだけ、テストBeanを配線したいと思います。他のBeanは、テストしないときに使用する必要があります。これをどのようにアーカイブできますか?私はこのどこを読んで「デフォルト」を使用して

が、「DEV」のようなプロファイルの「デフォルト」へのフォールバックがないように思える:

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

ソリューションが近づい

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

- >配線のためのBeanが見つかりませんでした。

プロフィールを残す:

@Component 
public class OnlineMail implements Mailing {} 

- "localtest" プロファイルを実行しているとき>はユニークな例外をスローします。すべてのプロファイルを追加

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

これは、実際に働いているが、しかし、私たちの開発者は、彼らが「DEV <WindowsLogin>」を使用し、番号およびプロファイルを追加していない、1つの豆のために働くかもしれませんが、一つはなりますこれは間違いなく醜いのでいくつかの豆のためにそれを使用するときにトラブルに。

@Profile( "!localtest")のようなものを使用してもうまく動作していないようです。

特定のBeanが見つからない場合、誰かがデフォルトで「ワイヤー」を取得するためのより良い方法を知っていますか? ( "localtest")@ActiveProfilesを使用してテストを実行し、DEFAULTプロファイルとして "生産" を使用して、生産的環境を実行し

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

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

+0

'Profile' @'なしでは何も有線でない場合は、デフォルトの豆にする必要があります。コンポーネントの名前を設定する際に一意の例外を避けようとしましたか?つまり、@Component( "mail") '' @Profile( "localtest")とそれを除いたものですか? – n1ckolas

答えて

5

私はついに簡単な解決策を見つけました。

オンラインメールはデフォルトで接続されています。

@Component 
public class OnlineMail implements Mailing {} 

オフラインメールをOnlineMailに優先し、独自の例外を回避@Primary注釈を使用しました。 公共

@Component:

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!"; 
    } 
} 

事業ユニットテストメインで

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

    } 
} 

ワークス()で:

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

はこれを試してみてください。

はまた、私はSPR-10338導入される春ActiveProfilesResolver次のバージョンでお願いいたします - あなたは(「DEV1」ように、「DEV2」とを避けるために)のためにそれが参考になっかもしれません。

+0

私はこの解決策のポイントを得ていません。私たちはアプリケーションを配備するあらゆる場所で正しい環境を設定しています。だから、春はデフォルトを読み込まないはずですか?また、私はテスト用のファイルにも運用リソースが含まれているので、テスト用のデフォルトをどのように分割するかはわかりません。 –

+0

デフォルトのプロファイルとアクティブプロファイルの2種類のプロファイルがあります。http://stackoverflow.com/questions/10041410/default-profile-in-spring-3-1 –

+0

をチェックしてください。空の)スプリングプロファイルを作成しています。これは既に模擬用の "production"と "localtest"プロファイルを持っています。そして、開始時には、テスト用に@ActiveProfilesを使用し、サーバ用には 'pring.profiles.default'または'pring.profiles.active 'を使用してください。 –

0

春は非常によく@Profileで豆を注入サポートしていますメインクラス{

デモコード用
 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()); 
     } 
    } 

チェックこれを:Component` @https://github.com/m2land/InjectByProfile