具有多个输入字段的复合组件,验证在WebSphere 8.0中失败

时间:2014-12-30 21:00:13

标签: jsf jsf-2 websphere composite-component

我试图通过实现这个众所周知的例子来学习复合组件魔术:Composite component with multiple input fields不幸的是它不起作用。

现在详细说明。当我尝试使用基于Apache MyFaces 2.0的嵌入式JSF实现的WAS 8.0.0.9实现它时,我收到以下错误:

[12/30/14 22:34:00:375 IST] 00000095 BeanValidator W   cannot validate component with empty value: form:inputDate:day
[12/30/14 22:34:00:376 IST] 00000095 BeanValidator W   cannot validate component with empty value: form:inputDate:month
[12/30/14 22:34:00:377 IST] 00000095 BeanValidator W   cannot validate component with empty value: form:inputDate:year 

当我在WildFly 8.2 + Apache MyFaces 2.2上实现这个例子时,所有工作都像预期的那样。

这就是我在网页上使用这个复合组件的方式:

<h:form id="form">

    <hc:inputDate id="inputDate" value="#{testBean.date}"></hc:inputDate>
    <h:outputText id="outputDate" value="#{testBean.date}"></h:outputText>
    <p:commandButton update="outputDate" process="inputDate outputDate"/>             

</h:form>

其他所有内容就像在@BalusC示例中一样,没有任何变化。

我做错了什么?这可能是JSF实现中的错误吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

首先,WildFly不使用MyFaces。它使用Mojarra

关于你的具体问题,事实证明,在UIInput的情况下,MyFaces首先处理组件子节点的验证阶段,然后最终处理组件本身,而Mojarra完全相反。可以在提供的源代码中找到证据(单击链接以查看它)。

如果验证成功,UIInput组件的提交值始终设置为null。对于MyFaces,支持组件中的getSubmittedValue()方法仅在处理完所有子项后调用

@Override
public Object getSubmittedValue() {
    return day.getSubmittedValue()
        + "-" + month.getSubmittedValue()
        + "-" + year.getSubmittedValue();
}

因此总是最终返回null-null-null,导致getConvertedValue()中的转换错误,因为它不能解析为dd-MM-yyyy

为了解决这个问题,并保持Mojarra和MyFaces之间的兼容性,更好地检查是否设置了本地值(即组件已经成功验证),然后使用getSubmittedValue()getValue()因此。{/ p>

@Override
public Object getSubmittedValue() {
    return (day.isLocalValueSet() ? day.getValue() : day.getSubmittedValue())
        + "-" + (month.isLocalValueSet() ? month.getValue() : month.getSubmittedValue())
        + "-" + (year.isLocalValueSet() ? year.getValue() : year.getSubmittedValue());
}

博客文章已更新,以便将此考虑在内。