Шов @Factory в абстрактном базовом классе?

У меня есть ряд веб-действий, которые я реализую в Seam для выполнения операций создания, чтения, обновления и т. Д. Для моих действий чтения / обновления / удаления я хотел бы иметь отдельные классы действий, которые расширяют абстрактный базовый класс. Я хотел бы поместить метод @Factory в абстрактный базовый класс для извлечения элемента, над которым нужно действовать. Например, у меня это базовый класс:

public abstract class BaseAction {

   @In(required=false)@Out(required=false)
   private MyItem item=null;

   public MyItem getItem(){...}

   public void setItem(...){...}

   @Factory("item")
   public void initItem(){...}
}

Мои подклассы будут расширять BaseAction, так что мне не нужно повторять логику для загрузки элемента, который нужно просмотреть, удалить, обновить и т. Д. Однако, когда я запускаю свое приложение, Seam выдает ошибки, говоря, что я объявил несколько @ Фабрика того же объекта.

Есть ли способ обойти это? Есть ли способ предоставить @Factory в базовом классе без включения этих ошибок?


person Shadowman    schedule 17.06.2010    source источник


Ответы (1)


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

Я бы сделал следующее:

@Name( "action1" )
public class Action1 extends BaseAction
{
  ...
}

И в components.xml:

<factory name="action1Item" value="#{action1.item}" />
person mtpettyp    schedule 17.06.2010
comment
Другими словами, мне нужно переместить @Factory вниз в подклассы и по-другому назвать элемент, в отличие от возможности вытащить его в базовый класс. Верный? - person Shadowman; 17.06.2010
comment
Ага - какой бы подход вы ни выбрали, необходимо лишь обеспечить уникальность имени компонента. - person mtpettyp; 17.06.2010