2010-06-17 3 views
1

У меня есть ряд веб-действий, которые я реализую в Seam для выполнения операций создания, чтения, обновления и т. Д. Для моих операций чтения/обновления/удаления я хотел бы иметь отдельные классы действий, которые расширяют абстрактный базовый класс. Я хотел бы поместить метод @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 для одного и того же объекта.

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

ответ

2

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

Я хотел бы сделать следующее:

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

И в components.xml:

<factory name="action1Item" value="#{action1.item}" /> 
+0

Итак, другими словами, я бы нужно переместить @Factory вниз в подклассов и пункта имя по-разному, в отличие от возможности вытащить его в базовый класс. Верный? – Shadowman

+0

Yup - независимо от того, какой подход вам нужен, необходимо убедиться, что имя компонента уникально. – mtpettyp

Смежные вопросы