Как я могу переопределить определенный компонент Шва?

Я дразнил некоторые компоненты шва с помощью следующей подписи:

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

Я включаю свои насмешки путем изменения этой строки в моем components.xml


к этому:


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

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


Мое решение


Вот то, на чем я обосновался на основе ответа germanescobar.

Я изменил свои ложные подписи компонента для соответствия этому:

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

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


Для включения насмешки я установил installed=true.

1
задан Community 23 May 2017 в 12:04
поделиться

2 ответа

Что я обычно делаю, когда хочу переопределить только определенные компоненты, так это использовать файл 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 как о своем внешнем файле (или о application-context.xml для пользователей Spring), где вы можете переопределить любой компонент, который хотите.

1
ответ дан 2 September 2019 в 22:51
поделиться

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

Вызываемое, когда Seam инициализировал и запустил все компоненты

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

Вызывается после аутентификации пользователя, например devMode

Итак, создайте свой компонент ConditionallyEventComponent и определите его @Observer Event

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

    }

}

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

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

-Dprofile=development

Посмотрите в документации вашего сервера приложений, как установить системное свойство. И внутри вашего события 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
    }
}
1
ответ дан 2 September 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: