您在概念上没有任何误解。我也不明白。
我目前仍在调查为什么在第一个且仅在第一个 ajax 回调上调用 setter 的原因。我本来期望它总是被调用或永远不会被调用。 @fuggerjaki61 的分析在某种程度上是正确的方向,但它似乎与围绕 null 或未提交值的更大问题有关。
可以在最简单的解决方案中阅读大量信息:OmniFaceso:viewParam https://showcase.omnifaces.org/components/viewParam代替f:viewParam
And use
<o:viewParam id="param" name="param" value="#{testController.param}"/>
(不要忘记声明xmlns:o="http://omnifaces.org/ui"
,但是自从你should;-) 无论如何都在使用 OmniFaces,我认为它已经存在了:-) )
从我读到的所有信息中我认为也许设置
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
也可以解决这个问题,但事实并非如此。在第一次 ajax 调用时,仍然使用旧值调用 setter,而在第二次及后续调用中,如果未提交,则仅显式将该值设置为 null。也不是你想要的。
更多细节
@fuggerjaki61 的解决方案可能有效,但我不确定其他情况下的后果,因为我还可以修复这个问题通过改变其他事情但打破其他情况。如果我尝试比较基础知识o:viewParam
with f:viewParam
提交的值(如@fuggerjaki61 在另一个答案中提到的)确实发挥了作用。它保存在本地o:viewParam
@Override
public String getSubmittedValue() {
return submittedValue;
}
@Override
public void setSubmittedValue(Object submittedValue) {
this.submittedValue = (String) submittedValue; // Don't delegate to statehelper to keep it stateless.
}
而在 f:viewParam 中,它被读取并设置到 stateHelper
@Override
public Object getSubmittedValue() {
return getStateHelper().get(PropertyKeys.submittedValue);
}
/**
* PENDING (docs) Interesting that submitted value isn't saved by the parent
* @param submittedValue The new submitted value
*/
@Override
public void setSubmittedValue(Object submittedValue) {
getStateHelper().put(PropertyKeys.submittedValue, submittedValue);
}
阅读这里的java文档,我个人会说,你的问题中的“为什么”对我来说看起来像是某个地方有一个错误(或遗漏),尚未确定,但要么是意外地,要么是通过明确解决的o:viewParam