2011-09-15 5 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

트리 어댑터가 한 수준에서 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를 돌려줍니다. 이렇게하면 db에 열이 만들어지지 않습니다. "깨끗한"솔루션은 아니지만 작동 속도는 빠릅니다. 확실하지는 않지만 트리 아답터에서 직접 아는 한 처리 할 수도 있습니다. 그게 왜 거기에. –