我们有一个小页面,它使用viewParam将给定的Id转换为具体对象。在转换inputText字段(模糊)时调用此转换器,该字段经过验证。为什么?我可以重做这个,以便每次都不调用转换器吗?
这很烦人,因为转换器为BackingBean中的相应对象调用set-method,如果第一次调用该页面来创建此对象,则此bean为null。
<f:metadata>
<f:viewParam name="id" value="#{bean.object}"
converter="#{objectConverter}"
converterMessage="#{msgs['converter.msg.object']}"/>
<f:viewAction action="#{bean.init}"/>
</f:metadata>
<p:inputText id="text" value="#{cc.attrs.value}"
styleClass="inputTextValidated"
required="#{cc.attrs.required}"
requiredMessage="#{cc.attrs.requiredmessage}"
label="text" validatorMessage="#{cc.attrs.msg}" title="#cc.attrs.title}"
readonly="#{cc.attrs.readOnly}">
<cc:insertChildren/>
<p:ajax update="msg_text" event="blur"/>
</p:inputText>
<p>
<p:message id="msg_text" for="text" display="msg"/>
</p>
如果我们不使用转换器而只使用viewAction将Id转换为相应的对象(或者如果适用则创建新对象),一切都很好。这是解决此问题的唯一/正确解决方案吗?
我们确实使用带有CDI的primefaces 6.1。转换器是一个实现转换器接口的@Named和@ApplicationScoped bean。
在inputtext-field周围使用p:fragment也无济于事。
答案 0 :(得分:2)
这就是JSF工作原理的本质。如果您不想这样做,建议您检查一下OminFaces ViewParam:http://showcase.omnifaces.org/components/viewParam
从他们的文档中
无状态模式,避免不必要的转换,验证和模型 回发更新标准UIViewParameter实现 回发后再次调用模型设置器。这并不总是 绑定到视图作用域的bean时可能需要,并且可能导致 与昂贵的转换器结合使用时会出现性能问题。至 解决此问题,默认情况下,此组件将提交的值存储为 组件属性,而不是模型中的属性(因此处于视图状态) 如果绑定是绑定到视图作用域的bean)。
标准的UIViewParameter实现调用转换器并 验证者再次回发。当您不总是这样时 有必填=“ true”,但参数未保留在表单上 提交。您需要在每个命令中保留它 链接/按钮。为了解决这个问题,该组件不会调用 转换者和验证者再次回发。