2010-07-21 3 views
1

я насмешливый некоторые детали шва, используя следующую подпись:Как я могу переопределить определенный компонент шва?

@Name("myService") 
@Install(debug = true, precedence = Install.MOCK) 
public class MyServiceMock implements MyService 

включить мой издевается, изменив эту строку в моей components.xml

<core:init transaction-management-enabled="false" /> 

к этому:

<core:init transaction-management-enabled="false" debug="true" /> 

Это было прекрасно, когда я хотел издеваться над всеми классами. У меня только что мой ant-скрипт заменил мой обычный component.xml версией отладки.

Есть ли способ условно издеваться над одним или несколькими компонентами? Идеальное решение позволило бы мне определить, какие компоненты будут издеваться во внешнем файле, таком как components.properties или другой файл свойств.


мое решение


Вот что я остановился на на основе germanescobar's ответа.

Я изменил свои фиктивные подписи компонентов, чтобы соответствовать этому:

@Name("myService") 
@Install(false) 
public class MyServiceMock implements MyService 

Затем я добавил строку для каждого компонента, я хочу, чтобы дразнить к components.xml который выглядит следующим образом:

<component name="myService" installed="false" precedence="40" 
       class="com.foo.bar.baz.service.MyServiceMock" /> 

Чтобы включить макет, я установил installed=true.

ответ

1

Что я обычно делаю, когда я хочу, чтобы переопределить только некоторые компоненты, чтобы использовать файл components.xml. Так, например, если у меня есть интерфейс MyService с реализацией по умолчанию, как это:

@Name("myService") 
public class DefaultMyService implements MyService 

И я хочу, чтобы переопределить только то, что конкретный класс, я добавляю следующее components.xml:

<component name="myService" class="org.gescobar.MockMyService" precedence="30" /> 

Просто взгляните на приоритет. По умолчанию каждый компонент имеет приоритет 20, поэтому 30 будет переопределять этот компонент. Вы можете думать о components.xml как о внешнем файле (или о приложении-context.xml для пользователей Spring), где вы можете переопределить любой компонент, который вы хотите.

1

Вы можете либо полагаться на org.jboss.seam.postInitialization Event

Вызывается при Шов инициализации и начал все компоненты

Или org.jboss.seam.postAuthenticate. < имя пользователя >

Вызывается после того, как пользователь прошел проверку подлинности, таких как DevMode

Так создать свой ConditionallyEventComponent и определить его @Observer событие

@Name("conditionallyEventComponent") 
@Scope(ScopeType.APPLICATION) 
public class ConditionallyEvent { 

    @Observer("org.jboss.seam.postInitialization", create=true) 
    /* 
    * or @Observer("org.jboss.seam.postAuthenticate.devMode", create=true) 
    */ 
    public void postInitialization() { 
     /** 
      * An ideal solution would allow me to specify which components to mock out in an external file 
      */ 

     /** 
      * Here i am overriding ApplicationScoped components 
      * 
      * Maybe you want something like 
      * applicationContext.properties 
      * sessionContext.properties 
      */ 

     Context context = Contexts.getApplicationContext(); 

     ResourceBundle resourceBundle = ResourceBundle.getBundle("applicationContext"); 
     Enumeration<String> keyEnumeration = resourceBundle.getKeys(); 
     while(keyEnumeration.hasMoreElements()) { 
      String key = keyEnumeration.nextElement(); 
      /** 
       * Keep in mind newInstance method needs no-arg constructor 
       */ 
      context.set(key, Class.forName(resourceBundle.getString(key)).newInstance()); 
     } 

    } 

} 

Предоставляя создать атрибут, вы можете также укажите, должен ли быть создан компонент наблюдателя, если он не существует в момент создания события

Вы также можете поставить системное свойство следующего

-Dprofile=development 

Проверьте вашу документацию Application Server, как настроить системное свойство.И внутри postInitialization (или postAuthenticate) Событие

@Observer("org.jboss.seam.postInitialization", create=true) 
public void postInitialization() { 
    Properties properties = System.getProperties(); 

    String profile = properties.getProperty("profile"); 
    if(profile != null && profile.equals("development")) { 
     // do as shown above 
    } 
} 
+0

@braveterry Возможно, вы хотите перебрать все компоненты. См. Здесь: http://stackoverflow.com/questions/2838787/seam-list-all-components/2856848#2856848 как до –

+0

@braveterry См. Также http://stackoverflow.com/questions/3140804/how-do-you -create-components-xml-for-debug-development-in-seam –

+0

Я пробовал описанную процедуру http://stackoverflow.com/questions/3140804/how-do-you-create-components-xml-for-debug- разработки в шве до того, как я опубликовал. Он работает для условной установки компонента, но не для его переопределения. Вероятно, есть способ сделать это, но независимо от того, что я пробовал, оба компонента всегда заканчивались тем же приоритетом. – braveterry

Смежные вопросы