2014-08-31 53 views
4

我有一个超类PersonPropertyNotFoundException上有条件地呈现的子类中的ui:重复

public class Person { 
    public abstract Type getType(); 
} 

我有2个亚类的它:

public class JuridicalPerson extends Person { 
    public Type getType() { 
     return Type.JP; 
    } 
    public List<JuridicalBelong> getJuridicalBelongs() { 
     return juridicalBelongs; 
    } 
} 
public class NaturalPerson extends Person { 
    public Type getType() { 
     return Type.NP; 
    } 
    public List<NaturalBelong> getNaturalBelongs() { 
     return naturalBelongs; 
    } 
} 

JuridicalBelongNaturalBelong具有不同的性质和罐不会被分类。

我有他们在List<Person>想我呈现在JSF/Facelets的如下:

<ui:repeat value="#{bean.persons}" var="person"> 
    <h:panelGroup rendered="#{person.type eq 'JP'}"> 
     <ui:repeat value="#{person.juridicalBelongs}" var="juridicalBelong"> 
      ... 
     </ui:repeat> 
    </h:panelGroup> 
    <h:panelGroup rendered="#{person.type eq 'NP'}"> 
     <ui:repeat value="#{person.naturalBelongs}" var="naturalBelong"> 
      ... 
     </ui:repeat> 
    </h:panelGroup> 
</ui:repeat> 

然而,这导致了以下情况例外:

javax.el.PropertyNotFoundException :“com.example.NaturalPerson”类没有“juridicalBelongs”属性。

这怎么可能?按我rendered条件

<h:panelGroup rendered="#{person.type eq 'JP'}"> 

应该忽略NaturalPerson,对不对?

回答

5

这是由于Mojarra的<ui:repeat>状态管理中的一个错误引起的,当您在<ui:repeat>中使用EditableValueHolder组件(输入字段)时也会出现这个错误。这是根据issue 3215修复的。该修补程序在Mojarra 2.2.7中提供,并且根据issue 3221将JSF 2.0/2.1回送到Mojarra 2.1.29。因此,升级到至少该版本(或根据Mojarra homepage提供的最新版本)应该可以实现。

否则,您最好的选择是用<c:forEach>替换<ui:repeat>

+2

你总是有正确的答案!感谢您分享您的知识@BalusC! :) – marcel 2015-04-22 14:14:44

0

在我的情况下,我没有选择升级Mojarra的版本,并避免c:forEach(与ui可选渲染组件一起使用时导致很多副作用)我用ap:dataList重复它工作。 你将不得不做一些CSS样式来隐藏子弹,但我认为这是值得的价格。 我希望它可以帮助别人;)