获取特定组件的验证消息

unp*_*pix 3 validation jsf jakarta-ee

<h:inputText id="myInputText"
             title="The text from validation message here"
             style="#{component.valid? '' : 'border-color:red'}"
             validator="#{MyBean.validate}"
             required="true"
             requiredMessage="required"
             value="#{MyBean.value} />
<p:message for="myInputText" display="text"/>
Run Code Online (Sandbox Code Playgroud)

由于我想在 inputText 组件中自定义查找失败的验证,并且我知道可以知道组件是否已成功验证,因此我想知道它是否可行以及如何获取验证消息,以便将其显示为我的 inputText 组件的标题。

kol*_*sus 5

您在计划中遇到的问题是单个组件可以有多个消息排队。那你打算怎么办?出于演示目的,您可以使用

<h:inputText id="myInputText"
             title="#{facesContext.getMessageList('myInputText').get(0)}"
             style="#{component.valid ? '' : 'border-color:red'}"
             validator="#{MyBean.validate}"
             required="true"
             requiredMessage="required"
             value="#{MyBean.value}" />
Run Code Online (Sandbox Code Playgroud)

编辑:您应该将逻辑移动到您的支持 bean 中:

  1. 实现一个从可用FacesMessage列表中提取细节的方法,给定一个clientId

    public String getComponentMessageDetail(String clientId) {
        String detail = null;
        FacesContext ctxt = FacesContext.getCurrentInstance();
        List<FacesMessage> componentMessages = ctxt.getMessages(clientId);
    
        if (componentMessages != null && componentMessages.isEmpty() == false) {
            //returns the detail, from only the first message!
            detail = componentMessages.get(0).getDetail();
        }
    
        return detail;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在您的视图中使用实用程序方法

     <h:inputText id="myInputText"
                  title="#{MyBean.getComponentMessageDetail('myInputText')}"
                  style="#{component.valid ? '' : 'border-color:red'}"
                  validator="#{MyBean.validate}"
                  required="true"
                  requiredMessage="required"
                  value="#{MyBean.value}" />
    
    Run Code Online (Sandbox Code Playgroud)