2012-06-26 3 views
9

У меня есть BaseBean с @PostConstruct и фасоль, расширяющая его, на который я бы хотел назвать другой @PostConstruct. Я прочитал несколько мест, где он сказал, что это возможно, однако, кажется, что @postConstruct в расширяющемся классе называется первым (если второй вызывается вообще). Затем я получаю NPE в «контексте», потому что я предполагаю, что PostConstruct супербокса уже вызван.вызов @PostConstruct на супер-фасоль и расширяющийся боб

Возможно ли это? Если да, то что я делаю неправильно?

База боб:

@ManagedBean 
@RequestScoped 
public class BaseBean { 
@ManagedProperty(value = "#{contextBean}") 
    private ContextBean contextBean; 
    Context context; 
@PostConstruct 
public void setupContext() { 
    context = getContextBean().getContext(); 
} 

Расширение боб:

@ManagedBean 
@RequestScoped 
public class SmartBoxSearchBean extends BaseBean { 
@PostConstruct 
public void setUp() { 
    jsonHelper = context.get(SmartBoxJsonHelper.class); 
} 

Спасибо, Yotam.

+0

@YotamSeon У меня очень похожая проблема [здесь] (http://stackoverflow.com/q/29787068/330457). Вы пришли к выводу, что принятое предложение - единственное решение, которое вы могли бы сделать? –

ответ

10

@PostConstruct Суперкласс бэкэн-бэка вообще не вызывается, когда сконструирован управляемый компонент. Это называется только тогда, когда полностью отдельный экземпляр bean-компонента этого суперкласса был сконструирован, например, используя #{baseBean} в EL в вашем случае. Вы фактически получаете два полностью отдельных экземпляра #{baseBean} и #{smartBoxSearchBean}, где собственный метод класса @PostConstruct вызывается независимо от самого управляемого класса компонента.

Этот дизайн несколько странный. Суперкласс бэк-компонента обычно не используется как управляемый компонент.

Я предлагаю пересмотреть свой подход следующим образом:

public abstract class BaseBean { 

    @ManagedProperty("#{contextBean}") 
    private ContextBean contextBean; 

    public Context getContext() { 
     return contextBean.getContext(); 
    } 

} 

и

@ManagedBean 
@RequestScoped 
public class SmartBoxSearchBean extends BaseBean { 

    @PostConstruct 
    public void setUp() { 
     jsonHelper = getContext().get(SmartBoxJsonHelper.class); 
    } 

} 

Или, может быть, это, если вам не нужно ContextBean для других целей на всех

public abstract class BaseBean { 

    @ManagedProperty("#{contextBean.context}") 
    private Context context; 

    public Context getContext() { 
     return context; 
    } 

} 

Обратите внимание, что @ManagedProperty работает просто отлично, когда объявлено в суперклассе thi .


Update: в зависимости от функциональных требований, вы можете также отвязать бобы и просто впрыснуть #{baseBean} в {smartBoxSearchBean}.

@ManagedBean 
@RequestScoped 
public class BaseBean { 

    @ManagedProperty("#{contextBean}") 
    private ContextBean contextBean; 
    private Context context; 

    @PostConstruct 
    public void init() { 
     context = contextBean.getContext(); 
    } 

} 

и

@ManagedBean 
@RequestScoped 
public class SmartBoxSearchBean { 

    @ManagedProperty("#{baseBean}") 
    private BaseBean baseBean; 

    @PostConstruct 
    public void setUp() { 
     jsonHelper = baseBean.getContext().get(SmartBoxJsonHelper.class); 
    } 

} 
+1

Спасибо BalusC за супер быстрый ответ. Ваше решение будет работать, за исключением одной проблемы. В PostConstruct I BaseBean также инициализируются другие члены, которые используют расширяющиеся бобы ... –

+0

См. Обновление для ответа. – BalusC

+0

Еще раз спасибо! –

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