在OmniFaces <o:validateMultiple>
验证后,<p:inputText>
值将丢失。
我可以重新定位问题,然后web.xml包含参数javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
:
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
如果删除此参数 - 一切正常。
我有JSF视图:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:o="http://omnifaces.org/ui">
<h:form id="someForm">
<div>
<o:outputLabel for="bar1" value="Bar1" />
<p:inputText id="bar1" />
<p:message for="bar1"/>
</div>
<div>
<o:outputLabel for="bar2" value="Bar2" />
<p:inputText id="bar2" />
<p:message for="bar2"/>
</div>
<div>
<o:outputLabel for="bar3" value="Bar3" />
<h:inputText id="bar3" />
<h:message for="bar3"/>
</div>
<div>
<o:outputLabel for="bar4" value="Bar4" />
<h:inputText id="bar4" />
<h:message for="bar4"/>
</div>
<o:validateMultiple components="bar1 bar2 bar3 bar4"
validator="#{sameValueValidator}"
message="All values shold be the same"
showMessageFor="bar2 bar4"/>
<p:commandButton value="submit" process="@form" update="@form" />
</h:form>
</html>
和验证者:
public class SameValueValidator implements MultiFieldValidator {
@Override
public boolean validateValues(FacesContext context,
List<UIInput> components, List<Object> values) {
if (!values.isEmpty()) {
Object firstValue = values.get(0);
for (Object value : values) {
if (!Objects.equal(firstValue, value)) {
return false;
}
}
return true;
} else {
return false;
}
}
}
如果<o:validateMultiple>
验证失败(<p:inputText>
组件中的文字不相同)<p:inputText id="bar1">
和<p:inputText id="bar2">
变空,<h:inputText id="bar3">
和{{1}保持价值观。
我认为<h:inputText id="bar4">
不应该失去价值观,或者我做错了什么?
我正在使用,
答案 0 :(得分:4)
当提交的值为null且输入无效时,PrimeFaces渲染器似乎有一种快捷方式,而#34;将空字符串解释为null&#34;启用,也许是为了规避一些不起眼的bug。您可以在第一个if
语句中的ComponentUtils#getValueToRender()
下看到它(行号与PF 5.1匹配):
68 if(config.isInterpretEmptyStringAsNull() && submittedValue == null && context.isValidationFailed() && !input.isValid()) {
69 return null;
70 }
71 else if(submittedValue != null) {
72 return submittedValue.toString();
73 }
如果组件已经设置了本地值,那么该部分不会考虑。可以通过UIInput#isLocalValueSet()
进行检查。
如果您按如下所示重写它,那么它应该按预期工作:
68 if(config.isInterpretEmptyStringAsNull() && submittedValue == null && !input.isLocalValueSet() && context.isValidationFailed() && !input.isValid()) {
69 return null;
70 }
71 else if(submittedValue != null) {
72 return submittedValue.toString();
73 }
我可以向PF人员报告,但是当你看起来有Pro / Elite访问时,你可能会更好。