环境:JSF 2.2 与 Mojarra 2.2.12 和 CDI ViewScoped beans & javax.faces.STATE_SAVING_METHOD
设置为client
.
为了正确初始化我的bean,感谢<f:viewParam ... />
,我想(重新)执行 <f:viewAction action="#{bean.onLoad}" />
当我的ViewScoped
在 POST 请求之后,bean 被重新创建( View 已从 LRU 中推出,参见 com.sun.faces.numberOfLogicalViews)。
<f:metadata>
<f:viewParam maxlength="100" name="name" value="#{bean.file}" />
<f:viewAction action="#{bean.onLoad}" />
</f:metadata>
<o:form includeRequestParams="true">
<!-- action can only work if onLoad has been called -->
<p:commandButton action="#{bean.action}" />
</o:form>
有什么想法吗?
注释:
- 我知道
postBack="true"
但它不适合bean.onLoad()
将会在每个 POST 请求上调用。 - 我无法调用
onLoad()
在@PostConstruct
方法,因为viewParam
尚未设置值还没有(参见When to use f:viewAction versus PostConstruct?)。
最佳答案
I'm aware of
postBack="true"
but it's not suitable as bean.onLoad() would be called on every POST request.
您可以在 onPostback
中使用 EL属性,您可以在其中检查模型值和/或请求参数是否存在。
如果需要模型值,则只需检查它是否存在:
<f:metadata>
<f:viewParam maxlength="100" name="name" value="#{bean.file}" required="true" />
<f:viewAction action="#{bean.onLoad}" onPostback="#{empty bean.file}" />
</f:metadata>
如果不需要模型值,则还要检查请求参数:
<f:metadata>
<f:viewParam maxlength="100" name="name" value="#{bean.file}" />
<f:viewAction action="#{bean.onLoad}" onPostback="#{empty bean.file and not empty param.name}" />
</f:metadata>
<小时/>
I cannot call
onLoad()
in@PostConstruct
method because values have not been set by viewParam yet.
鉴于 <o:form>
的存在在您的代码片段中,我看到您正在使用 OmniFaces 。同一个实用程序库提供了 CDI @Param
注释的目的是在 @PostConstruct
之前注入(inject)、转换和验证 HTTP 请求参数。运行。
整个<f:viewParam><f:viewAction>
因此可以如下替换:
@Inject @Param(name="name", validators="javax.faces.Length", validatorAttributes=@Attribute(name="maximum", value="100"))
private String file;
@PostConstruct
public void onLoad() {
if (!Faces.isValidationFailed()) {
// ...
}
}
或者,如果您手头有 Bean Validation(又名 JSR303):
@Inject @Param(name="name") @Size(max=100)
private String file;
@PostConstruct
public void onLoad() {
if (!Faces.isValidationFailed()) {
// ...
}
}
关于jsf - 重新执行f :viewAction when ViewScoped bean is recreated following a POST request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33078064/