问题
I\'m trying to deal with @ManagedProperty but without success !
I\'ve been following this guide, and it not seems that hard. But my code simply won\'t work!
Here\'s a little snippet
@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();
}
This code gives me a NullPointerException, saying that loginBean is null!
Any suggestion?
回答1:
You are mixing JSF managed beans with CDI beans. Your LoginBean is a JSF managed bean (it has the @ManagedBean
annotation). Your MessageBean is a CDI bean (it has the @Named
annotation). If you changed the Message bean to a JSF managed bean (replacing @Named
with @ManagedBean
) then the problem should be solved (It should work with two CDI beans as well).
Here is a short overview of how injection works between both bean types:
CDI @Named --> CDI @Named (works)
CDI @Named --> JSF @ManagedBean (works only if scope of injected bean is broader)
JSF @ManagedBean --> JSF @ManagedBean (works only if scope of injected bean is broader)
JSF @ManagedBean --> CDI @Named (won't work)
But take care of the scope import classes. There are different classes for @SessionScoped
and @RequestScoped
depending on the bean type.
javax.faces.bean.SessionScoped
for @ManagedBeans
javax.enterprise.context.SessionScoped
for CDI @Named beans
In addition, for @Named
(CDI) use @Inject
and for @ManagedBean
use @ManagedProperty
. There is one thing that does not work in CDI. Your @ManagedProperty(value = "#{loginBean}")
gets a full bean, but @ManagedProperty(value = "#{loginBean.user}")
to get a 'property' of a bean works to. This is not directly possible in CDI with @Inject
. See CDI Replacement for @ManagedProperty for a 'solution'
来源:https://stackoverflow.com/questions/9921324/managedproperty-in-cdi-named-bean-returns-null