2014-08-31 55 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樣式來隱藏子彈,但我認爲這是值得的價格。 我希望它可以幫助別人;)