将 CDI bean 注入 JSF @ViewScoped bean
Inject CDI bean into JSF @ViewScoped bean
我对 JSF、CDI 项目有疑问。我做了很多研究,发现在 CDI 中没有 @ViewedScoped
注释。我用对话框解决了基于 ajax 的页面的问题。我想将变量从数据表传递给对话框。为此,我不能使用 @RequestedScoped
bean,因为值在请求结束后被丢弃。任何人都可以帮我解决吗?我不能使用 @SessionScoped
但恕我直言,这是一种不好的做法。或者也许只将这个变量保存到知道的会话中。你们能给我一些提示如何优雅地解决这个问题吗?
import javax.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class ServiceBean implements Serializable {
...
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class SomeBean {
@Inject
ServiceBean serviceBean;
@Postconstruct ...
错误信息如下:
com.sun.faces.mgbean.ManagedBeanCreationException: An error occurred performing resource injection on managed bean warDetailBean
首先,如果您尝试使用 CDI,您需要通过在您的应用程序中放置一个 WEB-INF/beans.xml
文件来激活它(注意该文件可以为空),有关该文件的更多信息可以在 Weld - JSR-299 Reference Implementation.
中找到
当您使用 Tomcat 时,请务必按照 How to install CDI in Tomcat?
中的步骤遵守所有配置要求
其次,即使您可以在 JSF 托管 bean 中使用 @Inject
,最好不要混合使用 JSF 托管 bean 和 CDI,请参阅 BalusC's关于 Viewscoped JSF and CDI bean.
的详细回答
所以如果你只想使用 CDI @Named
bean,你可以使用 OmniFaces 自己的 CDI 兼容 @ViewScoped
:
import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@Named
@ViewScoped
public class SomeBean implements Serializable {
@Inject
ServiceBean serviceBean;
}
或,如果你只想使用JSF托管bean,你可以使用@ManagedProperty
注入属性:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class SomeBean{
@ManagedProperty(value = "#{serviceBean}")
ServiceBean serviceBean;
}
另请参阅:
- ManagedProperty in CDI @Named bean returns null
- Omnifaces CDI ViewScoped
我对 JSF、CDI 项目有疑问。我做了很多研究,发现在 CDI 中没有 @ViewedScoped
注释。我用对话框解决了基于 ajax 的页面的问题。我想将变量从数据表传递给对话框。为此,我不能使用 @RequestedScoped
bean,因为值在请求结束后被丢弃。任何人都可以帮我解决吗?我不能使用 @SessionScoped
但恕我直言,这是一种不好的做法。或者也许只将这个变量保存到知道的会话中。你们能给我一些提示如何优雅地解决这个问题吗?
import javax.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class ServiceBean implements Serializable {
...
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class SomeBean {
@Inject
ServiceBean serviceBean;
@Postconstruct ...
错误信息如下:
com.sun.faces.mgbean.ManagedBeanCreationException: An error occurred performing resource injection on managed bean warDetailBean
首先,如果您尝试使用 CDI,您需要通过在您的应用程序中放置一个 WEB-INF/beans.xml
文件来激活它(注意该文件可以为空),有关该文件的更多信息可以在 Weld - JSR-299 Reference Implementation.
当您使用 Tomcat 时,请务必按照 How to install CDI in Tomcat?
中的步骤遵守所有配置要求其次,即使您可以在 JSF 托管 bean 中使用 @Inject
,最好不要混合使用 JSF 托管 bean 和 CDI,请参阅 BalusC's关于 Viewscoped JSF and CDI bean.
所以如果你只想使用 CDI @Named
bean,你可以使用 OmniFaces 自己的 CDI 兼容 @ViewScoped
:
import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@Named
@ViewScoped
public class SomeBean implements Serializable {
@Inject
ServiceBean serviceBean;
}
或,如果你只想使用JSF托管bean,你可以使用@ManagedProperty
注入属性:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class SomeBean{
@ManagedProperty(value = "#{serviceBean}")
ServiceBean serviceBean;
}
另请参阅:
- ManagedProperty in CDI @Named bean returns null
- Omnifaces CDI ViewScoped