2011-09-15 2 views
0

richfaces recursiveTreeNodesAdaptor.Myエンティティクラスを使用して継ぎ目にダイナミックツリーを作成したいと思います。recursiveTreeNodesAdaptorを使用してSeamでダイナミックツリーを作成する

@Entity 
public class Category extends Item implements Serializable { 

private static final long serialVersionUID = -1154500438874768209L; 
private List<Item> children; 

public void addChild(Item child) { 
    if (children == null) { 
     children = new ArrayList<Item>(); 
    } 

    if (!children.contains(child)) { 
     children.add(child); 
    } 
} 

@OneToMany(cascade = CascadeType.ALL) 
public List<Item> getChildren() { 
    return children; 
} 

public void setChildren(List<Item> children) { 
    this.children = children; 
} 
} 

@Entity 
public class Product extends Item implements Serializable { 
    private static final long serialVersionUID = 3975153531436996378L; 
} 

@Inheritance(strategy = InheritanceType.JOINED) 
@Entity 
public class Item { 
private String name; 
private Long id; 

@Id 
@GeneratedValue 
public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 
} 

ここではこのクラスを使用します。

@Name("provider") 
@Scope(ScopeType.APPLICATION) 
public class OrganisationProvider implements Serializable { 


private static final long serialVersionUID = 1L; 

    public Category organization; 

public OrganisationProvider() { 
    if (organization == null) { 
     setOrganization(createOrganization()); 

    } 

} 

public Category createOrganization() { 
    Category ROOT = new Category(); 
    Category computerC = new Category(); 
    Category printerC = new Category(); 
    Category telephoneC = new Category(); 

    Product product = new Product(); 

    ROOT.setName("ROOT"); 
    computerC.setName("BilgisayarC"); 
    printerC.setName("YazıcılarC"); 
    telephoneC.setName("TelephoneC"); 

    computerC.addChild(printerC); 

    ROOT.addChild(computerC); 
    ROOT.addChild(product); 

    return ROOT; 
} 

public void setOrganization(Category organization) { 
    this.organization = organization; 
} 

public Category getOrganization() { 
    return organization; 
} 
} 

と私の.xhtmlページです。

<ui:define name="body"> 
    <h:form> 
     <rich:panel id="dynamicTreePanel" 
      header="Dynamic Tree User Interface"> 

      <rich:tree> 
       <rich:recursiveTreeNodesAdaptor roots="#{provider.organization}" 
        var="rootOrg"> 
        <rich:treeNode> 
         <h:outputText value="#{rootOrg.name}" /> 
        </rich:treeNode> 

        <rich:recursiveTreeNodesAdaptor roots="#{rootOrg.children}" 
         var="childOrg" nodes="#{childOrg.children}"> 
         <rich:treeNode> 
          <h:outputText value="#{childOrg.name}" /> 
         </rich:treeNode> 
        </rich:recursiveTreeNodesAdaptor> 

       </rich:recursiveTreeNodesAdaptor> 
      </rich:tree> 
     </rich:panel> 
    </h:form> 

</ui:define> 

展開ページでルートをクリックすると、このエラーが発生します。

javax.faces.FacesException:javax.el.PropertyNotFoundException:/dynamicItemTree.xhtml @ 23,52 nodes = "#{childOrg.children}":クラス 'a.b.c.d.Product'には 'children'というプロパティはありません。

答えて

0

ツリーアダプタが1つのレベルのProductアイテムに到達し、その子を読み取ろうとしています。このクラスにgetchildrenメソッドがないため、これは失敗します。

場合には、その製品をGetChildrenメソッドを呼び出す防ぐか、常にnullまたは空の配列を返す製品でメソッドを実装

+0

しかし、我々は、実体経てentityMappingグループをやっているのどちらか。 nullを返すProductでメソッドを実装すると、プログラムはそのメソッドについてデータベースに新しい列を作成しようとしますが、このエラーを受け取ります。 – shafak

+0

org.hibernate.MappingException:java.util.Listの型を判別できませんでした。テーブルのProduct:カラム:[org.hibernate.mapping.Column(children)] – shafak

+0

getChildrenメソッドはProductとnullを返します。これはあなたのデータベースに列を作成しません。それは "クリーン"な解決策ではありませんが、それは動作し、速いです。私は確信していませんが、私が知っている限り、ツリーアダプターで直接それを処理することもできます。それはなぜそこにある。 –

関連する問題