Как я могу переопределить определенный компонент Seam? - PullRequest
1 голос
/ 22 июля 2010

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

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

Я включаю свои макеты, изменяя эту строку в моих компонентах. Xml

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

к этому:

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

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

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


Мое решение


Вот то, на чем я остановился, основываясь на ответе germanescobar .

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 22 июля 2010

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

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

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

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

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

1 голос
/ 22 июля 2010

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

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

Или 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());
        }

    }

}

Предоставляя атрибут 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
    }
}
...