您的 bean 是请求范围的,并且您仅在操作时加载数据模型,而不是在(后)构造时加载。当加载数据的操作完成后的 HTTP 响应时,该 bean 将被丢弃。随后的请求将获得一个全新的 bean 实例,所有属性都设置为默认值。但是,由于在(后)构造期间没有保留相同的数据模型,因此它保持为空。
在 JSF2 中,您可以使用@ViewScoped
. 这样,只要您通过回发(返回null
or void
)与相同的视图交互,bean 就会存在。
在 CDI 中,您需要使用 来解决这个问题@ConversationScoped
,而这又需要一些额外的样板文件,并在适当的时候@Inject Conversation
完成begin()
并调用。end()
有关具体示例,另请参阅在 JSF 2.0 中为向导模式使用什么范围?.
另一种方法是通过命令链接/按钮将负责创建数据模型的参数传递给后续请求<f:param>
,如下所示
<h:commandButton value="save" ...>
<f:param name="period" value="#{bean.period}" />
</h:commandButton>
然后在请求范围 bean 的(后)构造函数中重新创建完全相同的数据模型,如下所示
String period = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("period");
List<SapFinancialPeriod> sapFinancialPeriodList = someservice.list(period);
(如果您使用的是标准 JSF,那么上面的解决方法会更好@ManagedProperty
;据我所知,CDI 没有注释可以让您将 HTTP 请求参数设置为 bean 属性)
也可以看看:
与具体问题无关,即将推出的 JSF 2.2 使用带有新注释和新标签的新“Faces Flow”特性以更好的方式解决了这一功能需求。@FlowScoped
xmlns:j="http://java.sun.com/jsf/flow"