ManagedProperty w CDI @Named bean zwraca null

Próbuję poradzić sobie z @ ManagedProperty ale bez powodzenia !

Podążałem za tym przewodnikiem i nie wydaje mi się to takie trudne. Ale mój kod po prostu nie działa!

Oto mały fragment

@ManagedBean
@SessionScoped
public class LoginBean {

@EJB
private LoginUserLocal loginUser;
private boolean loggedIn = false;
private User user;
private StreamedContent image;
.
.
.
//--
@Named(value = "messagesBean")
@RequestScoped
public class MessagesBean {

@ManagedProperty(value = "#{loginBean}")
private LoginBean loginBean;

public LoginBean getLoginBean() {
    return loginBean;
}

public void setLoginBean(LoginBean loginBean) {
    this.loginBean = loginBean;
}

public String getUser() {
    System.err.println(loginBean == null);
    return loginBean.getUser().getUsername();
}

Ten kod daje mi NullPointerException, mówiący, że loginBean jest null!

Jakieś sugestie?
Author: Matt Handy, 2012-03-29

1 answers

Mieszasz fasolę JSF z fasolą CDI. Twój LoginBean jest zarządzany przez JSF (posiada adnotację @ManagedBean). Twój MessageBean jest CDI bean (posiada adnotację @Named). Jeśli zmieniłeś wiadomość bean na zarządzaną przez JSF bean (zastępując @Named na @ManagedBean), problem powinien zostać rozwiązany(powinien działać również z dwoma CDI Bean).

[15]}Oto krótki przegląd działania iniekcji pomiędzy obydwoma rodzajami fasoli:

CDI @Named -- > CDI @Named (działa)

CDI @Named -- > JSF @ManagedBean (działa tylko wtedy, gdy zakres injected bean jest szerszy) JSF @ ManagedBean -- > JSF @ManagedBean (działa tylko wtedy, gdy zakres injected bean jest szerszy)

JSF @ManagedBean -- > CDI @Named (nie zadziała)

Ale zadbaj o klasy importu zakresu. Istnieją różne klasy dla @SessionScoped i @RequestScoped w zależności od rodzaju fasoli.

javax.faces.bean.SessionScoped for @ManagedBeans

javax.enterprise.context.SessionScoped dla CDI @ Named fasola

Ponadto do stosowania @Named (CDI) @Inject i do stosowania @ManagedBean @ManagedProperty. Jest jedna rzecz, która nie działa w CDI. Twój @ManagedProperty(value = "#{loginBean}") dostaje pełną fasolę, ale @ManagedProperty(value = "#{loginBean.user}") aby uzyskać "własność" fasoli działa. Nie jest to bezpośrednio możliwe w CDI z @Inject. Zobacz zamiennik CDI dla @ ManagedProperty dla "rozwiązania"

 37
Author: Matt Handy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-30 16:13:57