seam @create не заканчивается до того, как другие методы были вызваны для компонента - PullRequest
2 голосов
/ 01 октября 2009

Хорошо, у меня проблема с SEAM (2.1.1.GA), которая не имеет для меня никакого смысла.

У меня есть компонент, который имеет область видимости и помечается @ AutoCreate.

Компонент имеет метод создания, помеченный @ Create.

Проблема в том, что перед созданием метода seam вызывает другой метод в том же экземпляре компонента. Поскольку метод создания еще не завершен, этот второй метод вызывает ошибки.

Это ожидаемое поведение? Конечно, другие вызовы компонента должны блокироваться, пока не завершится выполнение create?!

Кто-нибудь знает что-нибудь об этом ... Я как бы в конце. На данный момент я просто пытаюсь обойти проблему, но кажется, что это вообще не должно быть проблемой.

Ответы [ 2 ]

3 голосов
/ 01 октября 2009

Что вызывает 2-й метод?

Если это другой Бин, который также создается автоматически при запуске, поместите свой первый Бин в качестве зависимости.

@AutoCreate
@Startup(depends={"firstBean"})
@Name("secondBean")
public class SecondBean() {
...
}
2 голосов
/ 30 июля 2012

Старый вопрос, но, так как я наткнулся на этот вопрос сегодня, возможно, это будет полезно для кого-то еще.

Вот что делает Component.newInstance ():

instance = instantiate();

if (getScope()!=STATELESS) {
   //put it in the context _before_ calling postconstuct or create
   getScope().getContext().set(name, instance); 
}

postConstruct(instance);

if (getScope()!=STATELESS) {
   callCreateMethod(instance);

   if (Events.exists()) {
       Events.instance().raiseEvent("org.jboss.seam.postCreate." + name, instance);
   }
}

Итак, последовательность событий:

  1. создание экземпляра вашего компонента
  2. поместите ваш компонент в область действия Session
  3. вызывает метод @Create

Шаг 2 означает, что другие методы компонента могут быть вызваны из других потоков до завершения метода @Create.

Так вот в чем проблема. Назовите это ошибкой в ​​Seam. В моем случае я мог бы обойти это, используя конструктор вместо @Create.

...