2013-06-11 2 views
1

Я хочу получить доступ к объекту bean-компонента @SessionScoped в другой фасоли, используя @ManagedProperty. Короче говоря, я хочу получить доступ к свойству name firstBean в secondBean.Невозможно получить доступ к управляемому bean-компоненту из другого управляемого компонента

@ManagedBean 
@SessionScoped 
public class FirstBean implements Serializable{ 
    private String name; 
    //...other attributes 
    //...constructor 
    public String getSelectedModel() { 
     return selectedModel; 
    } 

    public void setSelectedModel(String selectedModel) { 
     this.selectedModel = selectedModel; 
    } 
    //other getters&setters 
} 

И второй боб:

@ManagedBean 
@SessionScoped 
public class SecondBean implements Serializable{ 

@ManagedProperty(value="#{firstBean}") 
private FirstBean firstBean 

public SecondBean() { 
    System.out.println(firstBean.getName()); 
} 
public IndexBean getFirstBean() { 
    return firstBean; 
} 

public void setFirstBean(FirstBean firstBean) { 
    this.firstBean = firstBean; 
} 

Когда я запускаю это, я всегда получаю NullPointerException на System.out.println(firstBean.getName()); в конструкторе второй боб, который, кажется, означает, что мне нужно создать новый экземпляр firstBean ,

Но как ни странно, когда я прокомментировал эту строку, я могу сделать что-то вроде этого без ошибок, а это значит, что firstBean на самом деле является свойством secondBean.

<h:outputText value="#{secondBean.firstBean.name}" /> 

В чем проблема?

ответ

2

Невозможно получить доступ к инъецируемой зависимости в конструкторе. Вы в основном ожидали, что Java может сделать что-то вроде этого:

SecondBean secondBean; // Declare. 
secondBean.firstBean = new FirstBean(); // Inject. 
secondBean = new SecondBean(); // Construct. 

Это абсолютно невозможно установить переменную экземпляра, если экземпляр еще не построен. Вместо этого, он работает следующим образом:

SecondBean secondBean; // Declare. 
secondBean = new SecondBean(); // Construct. 
secondBean.firstBean = new FirstBean(); // Inject. 

Тогда для выполнения бизнес-действий на основе введенных зависимостей, используйте метод с аннотацией @PostConstruct. Он будет вызван менеджером впрыска зависимостей непосредственно после построения и инъекции зависимостей.

Таким образом, просто заменить

public SecondBean() { 
    System.out.println(firstBean.getName()); 
} 

по

@PostConstruct 
public void init() { // Note: method name is fully to your choice. 
    System.out.println(firstBean.getName()); 
} 
Смежные вопросы