![](/img/trans.png)
[英]Cannot inject a request scoped bean as managed property of a session scoped bean
[英]@ManagedProperty - Inject one request scoped bean into another request scoped bean
我有这个SearchBean :
@ManagedBean(name = "searchBean")
@RequestScoped
public class SearchBean implements Serializable
{
private String input = null;
// getter methods
public String getInput() {
return input;
}
// setter method
public void setInput(String input) {
this.input = input;
}
public String Submit() {
return null;
}
}
我可以使用@ManagedProperty将其注入另一个bean。 例如:
@ManagedBean(name = "bookBean")
@RequestScoped
public class BookBean implements Serializable
{
@ManagedProperty(value = "#{searchBean}")
private SearchBean searchBean;
@PostConstruct
public void init()
{
System.out.println("Value: " + searchBean.getInput());
}
public SearchBean getSearchBean() {
return searchBean;
}
public void setSearchBean(SearchBean searchBean) {
this.searchBean = searchBean;
}
}
和Facelet(search.xhtml):
<h:form id="formSearch">
<h:commandButton value="Search" action="#{searchBean.Submit}" />
</h:form>
更新 :我通过ui:insert
组件ui:insert
search.xhtml
插入book.xhtml
,如下所示:
<h:form id="formBooks">
<ui:insert name="search">
<ui:include src="/templates/common/search.xhtml"/>
</ui:insert>
</h:form>
上面的searchBean.getInput()
方法应该作为表单提交的结果返回一个值。 上述注射方法是否可行?
我假设SearchBean.input
将绑定到输入字段 :
public class SearchBean implements Serializable {
private String input = null;
像这样的东西:
<h:inputText value="#{searchBean.input}" />
如果是这样,那么这将是null:
@PostConstruct
public void init()
{
System.out.println("Value: " + searchBean.getInput());
}
但是 ,假设已设置一个值,则在调用此方法时它不会为null:
public String Submit() {
return null;
}
图片来自Richard Hightower的非信徒JSF:JSF应用程序生命周期 。
原因在于JSF生命周期的工作原理:
#{searchBean...}
并发现不存在时:
SearchBean.setInput(String)
SearchBean.Submit()
此过程在JSF规范中定义。
现在,如果直接从参数映射中注入SearchBean.input
,则在@PostConstruct
期间它不会为null:
@ManagedProperty(value = "#{param.someParamName}")
private String input;
但是,这没有任何真正的优势 - 您正在跳过任何输入验证,并且您不能将SearchBean.input
用作字段绑定,因为它将在Update Model Values阶段被覆盖。
SearchBean.Submit()
方法是执行搜索的应用程序逻辑所在的位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.