Как работает создание компонентов в зависимости от типа области - PullRequest
2 голосов
/ 14 октября 2010

Несмотря на то, что я указал тип области в качестве метода, он создается в области видимости.

> UserHome userHome = (UserHome) Component.getInstance (UserHome.class, ScopeType.METHOD);

Это довольно странно, кто-то может объяснить это поведение?

Ответы [ 2 ]

2 голосов
/ 14 октября 2010

При вызове

Component.getInstance(UserHome.class, ScopeType.METHOD);

Внутреннее поведение шва заключается в вызове

Object result = Contexts.lookupInStatefulContexts(name);

API lookupInStatefulContexts говорит:

Поиск именованного атрибута во всех контекстах, в следующем порядке: метод, событие, страница, разговор, сеанс, бизнес-процесс, приложение.

Так как ваш ScopeType.METHOD не содержит ваш компонент UserHome.class, поиск продолжается до полученияего область (StypeType.CONVERSATION, верно?)

ОБНОВЛЕНИЕ

У меня сложилось впечатление, что если вы укажете ScopeType для , то получите метод getInstance.сможет создать объект в этой области

Если с целевым компонентом не связана требуемая область, метод getInstance не создает компонент в этой области ,Вместо этого он выполняет иерархический поиск с использованием Contexts.lookupInStatefulContexts, пока не получит некоторую назначенную область действия

Если вы хотите, чтобы компоненту можно было назначить более одной области действия, вы должны сделать его с помощью @Role.(@Roles) аннотация

@Name("user")
@Scope(ScopeType.EVENT)
@Role(name="loggedUser", scope=ScopeType.SESSION)
public class User { ... }

Таким образом, вы указываете желаемую область действия

Component.getInstance(User.class, ScopeType.EVENT);

или

Component.getInstance(User.class, ScopeType.SESSION);

Помните, что Seam выполняет поиск по полю / свойствуимя

private @In User user; // Take ScopeType.EVENT as scope

private @In User loggedUser; // Take ScopeType.SESSION as scope
1 голос
/ 14 октября 2010

Полагаю, ваш UserHome класс расширяет класс EntityHome Шва. Суперкласс EntityHome, то есть Home, находится в области действия ScopeType.CONVERSATION:

@Scope(ScopeType.CONVERSATION)
public abstract class Home<T, E> extends MutableController<T>

Либо вы не перекрыли область действия в объявлении UserHome, либо Seam игнорирует аннотации @Scope в подклассах, если один из суперклассов уже имеет аннотацию @Scope.

...