Jsf 2 jsf2使用FacesMessages突出显示组件(o:highlight)

Jsf 2 jsf2使用FacesMessages突出显示组件(o:highlight),jsf-2,omnifaces,Jsf 2,Omnifaces,我有一些输入组件,只有在所有其他情况下执行特定操作时才应该验证它们,它们应该接受每个输入 这样我就不能使用普通的验证器,但有一个commandButton,用于评估其action方法中的数据,并在缺少某些内容时创建一些与特定ClientID相关的FacesMessages 现在,我通常使用组件来指向需要进一步操作的字段,但在这种情况下,输入组件是有效的,因此高亮显示组件不考虑它们 现在我想知道是否有可能让这种行为依赖于带有消息的ID列表 大概是这样的: for (Iterator<Stri

我有一些输入组件,只有在所有其他情况下执行特定操作时才应该验证它们,它们应该接受每个输入

这样我就不能使用普通的验证器,但有一个commandButton,用于评估其action方法中的数据,并在缺少某些内容时创建一些与特定ClientID相关的FacesMessages

现在,我通常使用组件来指向需要进一步操作的字段,但在这种情况下,输入组件是有效的,因此高亮显示组件不考虑它们

现在我想知道是否有可能让这种行为依赖于带有消息的ID列表

大概是这样的:

for (Iterator<String> it = FacesContext.getCurrentInstance()
                .getClientIdsWithMessages(); it.hasNext();) {
        String clientId = it.next();
        List<FacesMessage> messageList = FacesContext
                .getCurrentInstance().getMessageList(clientId);
        if (messageList != null) {
            for (FacesMessage msg : messageList) {
                ... // build json with clientIds (maybe check for UIInput
            }
        }
}
如果需要这种方式,可以为信息、警告和错误消息引入新的样式类。也许它甚至更快一点,因为不需要访问整个组件树,但这只是一个猜测

那你怎么看?这是对当前行为的一个相当艰难的改变,所以我不确定这个猜测是否会变成全方位的,或者必须单独实现

现在我想知道是否有可能让这种行为依赖于带有消息的ID列表

从javadoc中,使用与您相同的方法:

请注意,也可以参考,但它没有指出与这些客户机ID关联的组件是否实际上是非客户机ID的组件

因此,对于每个客户端ID,您仍然需要使用UIViewRootfindComponent来查找组件、计算其类型并验证其有效性。这比参观一棵树要贵得多

如果您确实需要在action方法中执行验证,那么最好的办法是自己将上下文和输入标记为无效

FacesContext context = FacesContext.getCurrentInstance();
context.validationFailed();
((UIInput) context.getViewRoot().findComponent(clientId)).setValid(false);
或者,为了满足具体的功能要求

我有一些输入组件,只有在所有其他情况下执行特定操作时才应该验证它们,它们应该接受每个输入

只需使用普通的验证器,在其中检查调用的操作:

public void validate(FacesContext context, UIComponent component, Object value) {
    if (!context.getExternalContext().getRequestParameterMap().containsKey("formId:buttonId")) {
        return;
    }

    // ...
}

即,当调用时,将执行验证。这总比在错误的地方执行验证好。

谢谢您的提示,我必须使用第一种方法,因为第二种方法不起作用,因为我必须检查一些必填字段,而它们的问题是,周围的组件a rich:tabPanel with switchType=ajax将提交它的完整内容,因此我在更改选项卡时也会寻找按钮,我无法以任何方式影响它,至少目前不能。不管怎样,对于不同的脸型,不同的风格对你来说不是很有趣吗?我认为通过消息突出显示组件可能有用,而不仅仅是在组件无效时。