Jsf 2 JSF可选旧值在清除后返回
我使用的是JSF、PrimeFaces 3.2、Omnifaces 1.1、JBoss AS 7.1.1、Final和Mojarra 2.1.7 我有一个表单,它有两个数字字段,这两个字段都不是必需的,如下所示:Jsf 2 JSF可选旧值在清除后返回,jsf-2,primefaces,reset,optional,omnifaces,Jsf 2,Primefaces,Reset,Optional,Omnifaces,我使用的是JSF、PrimeFaces 3.2、Omnifaces 1.1、JBoss AS 7.1.1、Final和Mojarra 2.1.7 我有一个表单,它有两个数字字段,这两个字段都不是必需的,如下所示: <h:form> <p:inputText id="num1" value="#{bean.field1}"/> <p:inputText id="num2" value="#{bean.field2}"/> <p:comman
<h:form>
<p:inputText id="num1" value="#{bean.field1}"/>
<p:inputText id="num2" value="#{bean.field2}"/>
<p:commandButton ... ajax="true" />
</h:form>
我还在faces配置上设置了OmniFaces ResetInputAjaxActionListener
bean属性field1和field2是整数
现在的问题是,如果我在num1上输入123,在num2上输入345,然后单击OK all OK。
如果我把123从num1中去掉,把abc放在num2上。然后显示验证(转换)错误,但返回123
如果我把它们都设为required=true,那么一切都很好
有没有一种方法可以通过可选字段实现这一点?这是Mojarra特有的问题。绑定到
整数
的字段由整数转换程序隐式转换,该转换程序将提交的空字符串值转换为null
,并将其设置为组件的本地值
当表单在提交后重新显示时,JSF将首先检查提交的值是否为null,然后显示它,否则如果本地值不为null,则显示它,否则显示模型值。由于本地值为null,因此将显示模型值。这确实是一种不受欢迎的行为,已经被报道过好几次:
这可以通过覆盖UIInput#getValue()
来解决,如下所示:
public Object getValue() {
return isLocalValueSet() ? getLocalValue() : super.getValue();
}
已经做对了。我再次讨论了这个问题,它最终以(更新结束,并最终在Mojarra 2.2.0中修复,并向后移植到)
同时,在考虑第三方组件库及其自己的呈现器(如PrimeFaces)的同时,解决此问题的最简单方法是将javax.faces.component.UIInput
class的源代码文件直接复制到项目的源文件夹中,然后添加所需的UIInput#getValue()
方法。是的,这是一个笨拙的修复,但是没有更好的解决方法,因为问题的根源在于JSFAPI本身
OmniFacesResetInputAjaxActionListener
的用途完全不同,其设计/适用于解决此问题。它应该清除未提交组件值的输入组件的状态,但组件本身在ajax中重新呈现。这是Mojarra特有的问题。绑定到整数
的字段由整数转换程序隐式转换,该转换程序将提交的空字符串值转换为null
,并将其设置为组件的本地值
当表单在提交后重新显示时,JSF将首先检查提交的值是否为null,然后显示它,否则如果本地值不为null,则显示它,否则显示模型值。由于本地值为null,因此将显示模型值。这确实是一种不受欢迎的行为,已经被报道过好几次:
这可以通过覆盖UIInput#getValue()
来解决,如下所示:
public Object getValue() {
return isLocalValueSet() ? getLocalValue() : super.getValue();
}
已经做对了。我再次讨论了这个问题,它最终以(更新结束,并最终在Mojarra 2.2.0中修复,并向后移植到)
同时,在考虑第三方组件库及其自己的呈现器(如PrimeFaces)的同时,解决此问题的最简单方法是将javax.faces.component.UIInput
class的源代码文件直接复制到项目的源文件夹中,然后添加所需的UIInput#getValue()
方法。是的,这是一个笨拙的修复,但是没有更好的解决方法,因为问题的根源在于JSFAPI本身
OmniFacesResetInputAjaxActionListener
的用途完全不同,其设计/适用于解决此问题。它应该清除未提交组件值的输入组件的状态,但组件本身在ajax中被重新呈现。我忘记提到javax.faces.exploration\u EMPTY\u STRING\u submitted\u VALUES\u,因为\u NULL参数设置为falseRight,这是由隐式的IntegerConverter
引起的,它正在将“
转换为null
(假设这些字段绑定到Integer
)是的,它们绑定到Integer。所以这不应该发生在字符串上?除非有其他原因,否则它也会发生在字符串上。我能够通过为java.lang.String编写一个自定义转换器,将空值设置为空字符串,从而绕过字符串的这个问题。但对于整数(和日期)来说,这是一项更困难的任务。有什么想法吗?我忘了提到javax.faces.exploration_EMPTY_STRING_SUBMITTED_VALUES_作为_NULL参数设置为false right,这是由隐式的整数转换器
引起的,它正在将“
转换为NULL
(假设这些字段绑定到整数
)是的,它们绑定到整数。所以这不应该发生在字符串上?除非有其他原因,否则它也会发生在字符串上。我能够通过为java.lang.String编写一个自定义转换器,将空值设置为空字符串,从而绕过字符串的这个问题。但对于整数(和日期)来说,这是一项更困难的任务。有什么想法吗?