2

jsfによって出力されたBeanで継承を使用したい。たとえば、異なる属性(catAttrとdogAttr)を持つ2つの子(catとdog)とdiscriminator(type)を持つ親クラス(animal)があります。動物のリストとそのすべての属性を印刷したいと思います。コード例(プロパティが見つからないという例外が返されます)、jsfページ:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
    <title>Facelet Title</title>
</h:head>
<h:body>
    <ui:repeat value="#{animalsBean.animals}" var="a">
        <!-- General attributes -->
        <label>Name: </label> #{a.name}<br/>

        <!-- Specific attributes -->
        <h:panelGroup rendered="#{a.type eq 'cat'}">
            <label>Cat attributes:</label>
            <h:inputTextarea value="#{a.catAttr}"/><br/>
        </h:panelGroup>
        <h:panelGroup rendered="#{a.type eq 'dog'}">
            <label>Dog attributes:</label>
            <h:inputTextarea value="#{a.dogAttr}"/><br/>
        </h:panelGroup>
    </ui:repeat>
</h:body>

AnimalsBean:

@ManagedBean
@SessionScoped
public class AnimalsBean {
    private List<Animal> animals;

    public List<Animal> getAnimals() {
        return animals;
    }

    public void setAnimals(List<Animal> animals) {
        this.animals = animals;
    }
}

誰かが私を助けることができますか?ありがとう!

4

1 に答える 1

3

JSF タグ コンポーネントは、モデル クラスの内部タイプ (cat、dog など) を認識できません。親クラスを使用している場合は、そのクラスの public 属性のみを使用できます (これはすべての子クラスに共通です)。

public class Animal {
    protected String name;
    //getter and setter...
}

public class Cat extends Animal {
    private String specie;
    //getter and setter...
}

public class Dog extends Animal {
    public String race;
    //getter and setter...
}

@SessionScoped
@ManagedBean(name="animalBean")
public class AnimalsBean {
    private Cat cat;
    private Dog dog;
    private Animal animal;

    public AnimalsBean() {
        cat = new Cat();
        dog = new Dog();
        animal = new Cat();
    }

    //getters and setters...
}

このための xhtml コード:

<h:form>
    <h:inputText value="#{animalBean.cat.specie}" />
    <h:inputText value="#{animalBean.dog.race}" />
    <h:inputText value="#{animalBean.animal.name}" />
    <!-- this line won't work -->
    <h:inputText value="#{animalBean.animal.specie}" />
</h:form>
于 2012-04-15T22:29:04.983 に答える