<f:attribute name="id"> 在 javax.faces.component.UIComponent.setValueExpression 处抛出 java.lang.IllegalArgumentException

<f:attribute name="id"> throws java.lang.IllegalArgumentException at javax.faces.component.UIComponent.setValueExpression

我有一个 select 一个菜单,其中有一个验证器,如下所示:

<h:selectOneMenu value="#{planning.formuleCremation}"
     converter="#{formuleCremationConverter}" 
     validator="#{PlanningSalleAppareilFormuleCremationValidator}">
  <f:selectItems value="#{beanPlanningSalleAppareil.formules}"
         var="formule"
         itemLabel="#{formule.alias}"
         itemValue="#{formule}" />
  <f:attribute name="id" value="#{planning.id}" /> 
</h:selectOneMenu>

我正在尝试使用 selectOneMenu 传递属性,以便我可以在 PlanningSalleAppareilFormuleCremationValidator 中检索它,如下所示:

public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException {

     //Retrieve the attribute id passed with the current component
     int id = (int) uic.getAttributes().get("id");
     Object selectedObject = null;

     //Current Planning
     PlanningSalleAppareil planningSalleAppareil = planningSalleAppareilService.trouver(id);

     if(planningSalleAppareil.getAppareil() != null)
         selectedObject = planningSalleAppareil.getAppareil();
     if(planningSalleAppareil.getSalle() != null)
         selectedObject = planningSalleAppareil.getSalle();

     planningSalleAppareil.setFormuleCremation((FormuleCremation) o);

     if(selectedObject != null){
         String errorMessage = planningSalleAppareilService.validPlanningSalleAppareil(planningSalleAppareil,selectedObject);
         if(!errorMessage.equals("1")){
             FacesMessage msg = new FacesMessage(errorMessage);
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
             throw new ValidatorException(msg);
         }
     }
 }

但这行不通,它让我很困惑:java.lang.IllegalArgumentException at javax.faces.component.UIComponent.setValueExpression

当我仅将 <f:attribute name="id" value="#{planning.id}" /> 添加到 selectOneMenu 时出现此错误,否则验证器正在运行。

我该如何解决这个问题?

有效,

<h:selectOneMenu ...>
    <f:attribute name="id" value="#{planning.id}" />
    ...
</h:selectOneMenu>

完全相同
<h:selectOneMenu id="#{planning.id}" ...>
    ...
</h:selectOneMenu>

这种方法的问题是 JSF 不允许将呈现时间值表达式设置为组件的 id 属性。此外,您最好不要 override/reuse 用于 different/internal 目的的标准 JSF 组件属性。

将其重命名为其他名称,例如planningId.

<f:attribute name="planningId" ... />