@javax.faces.bean.ManagedProperty in CDI @Named bean returns null

前端 未结 1 444
别跟我提以往
别跟我提以往 2020-11-27 16:22

I\'m trying to deal with @javax.faces.bean.ManagedProperty but without success !

I\'ve been following this guide, and it not seems that hard. But my code

相关标签:
1条回答
  • 2020-11-27 16:43

    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). Or if you're using JSF 2.3 or newer, then use javax.faces.annotation.ManagedProperty instead in the CDI bean.

    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'

    0 讨论(0)
提交回复
热议问题