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



我有一个带有验证器的select one菜单,如下所示:

<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属性。此外,您最好不要为不同的/内部目的重写/重用标准JSF组件属性。

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

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

相关内容

最新更新