Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 JSF可选旧值在清除后返回_Jsf 2_Primefaces_Reset_Optional_Omnifaces - Fatal编程技术网

Jsf 2 JSF可选旧值在清除后返回

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

我使用的是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: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本身


OmniFaces
ResetInputAjaxActionListener
的用途完全不同,其设计/适用于解决此问题。它应该清除未提交组件值的输入组件的状态,但组件本身在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本身


OmniFaces
ResetInputAjaxActionListener
的用途完全不同,其设计/适用于解决此问题。它应该清除未提交组件值的输入组件的状态,但组件本身在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编写一个自定义转换器,将空值设置为空字符串,从而绕过字符串的这个问题。但对于整数(和日期)来说,这是一项更困难的任务。有什么想法吗?