1

現在、 3.5 から 4.0 に移行しています。
再帰的な方法を使用してこのツリーを作成し、データベースからツリーを取得しています。
3.5 を使用している場合、これは期待どおりに機能していました。しかし、 4 に移行すると、hibernate jpa を使用して編集/マージできません。エラーは、glassfish コンソールjava.lang.NumberFormatException: For input string: "null"でのみ表示されました。

私のエンティティを見てください:

@Entity
@Table(schema = "public", name = "menu")
@XmlRootElement
public class Menu implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(nullable = false)
private Integer menuid;
@Size(max = 100)
@Column(length = 100)
private String menuname;
private Integer parentid;
private Integer level;
private Integer ordering;
@Temporal(TemporalType.DATE)
private Date sessiondate;
@Size(max = 15)
@Column(length = 15)
private String action;
@Size(max = 15)
@Column(length = 15)
private String menutype;
@Column(name = "icon")
private String icon;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "parentid")
@OrderBy(value = "ordering")
private List<Menu> children = new LinkedList<>();

//appropriate getter setter

}

そして再帰を作成する私の方法:

public void generateMenuTree() throws SQLException {
    // findUserConfirmationDefault root menu
    rootMenu = menuFacadeLocal.findHomeMenu();

    //recursively createUserConfirmationDefault tree menu
    menuTree = createTree(rootMenu, null);
}

public TreeNode createTree(Menu menu, TreeNode rootNode) throws SQLException {
    TreeNode newNode = new DefaultTreeNode(menu, rootNode);

    for (Menu subMenu : menu.getChildren()) {
        if (("mm").equalsIgnoreCase(subMenu.getMenutype())) {
            TreeNode newNode2 = createTree(subMenu, newNode);
        }
    }

    return newNode;
}  

私は次を使用してツリーを表示しました:

<p:tab title="Access Menus">
<p:tree value="#{managePositionBean.menuTree}" var="menutree" selectionMode="checkbox" selection="#{managePositionBean.selectedTreeMenu}" animate="true">
    <p:treeNode icon="#{menutree.icon}">
        <h:outputText value="#{msgs[menutree.menuname]}"/>
    </p:treeNode>
</p:tree>

null多分ちょうどできる唯一のもの#{menutree.icon}
はい、スタックトレース:

INFO: java.lang.NumberFormatException: For input string: "null"
java.lang.NumberFormatException: For input string: "null"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at org.primefaces.component.api.UITree.findTreeNode(UITree.java:156)
at org.primefaces.component.api.UITree.setRowKey(UITree.java:87)
at org.primefaces.component.tree.TreeRenderer.decodeSelection(TreeRenderer.java:86)
at org.primefaces.component.tree.TreeRenderer.decode(TreeRenderer.java:56)
at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:787)
at org.primefaces.component.api.UITree.processDecodes(UITree.java:294)
at org.primefaces.component.tree.Tree.processDecodes(Tree.java:370)
at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176)
at org.primefaces.util.ComponentUtils.processDecodesOfFacetsAndChilds(ComponentUtils.java:414)
at org.primefaces.component.tabview.TabView.processDecodes(TabView.java:325)
at javax.faces.component.UIForm.processDecodes(UIForm.java:225)
at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:506)
at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
at javax.faces.component.UIForm.visitTree(UIForm.java:354)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:376)
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:252)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183)
at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:57)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:931)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.omnifaces.facesviews.FacesViewsForwardingFilter.doFilter(FacesViewsForwardingFilter.java:121)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.omnifaces.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:115)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.omnifaces.filter.GzipResponseFilter.doFilter(GzipResponseFilter.java:148)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at ch.qos.logback.classic.helpers.MDCInsertingServletFilter.doFilter(MDCInsertingServletFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at org.apache.catalina.core.StandardHostValve.__invoke(StandardHostValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:744)  

表示されたアイコンを削除しても機能しません..私
の環境は、、、、、でしJEE 7た。 Mojarra 2.1.24Glassfish 3.1.2.2Primefaces 3.5Primefaces Extension 1.0Omnifaces 1.5

私は混乱していました、問題は何ですか、それはprimefacesまたはmojarraまたは他の場所のバグですか、それとも私だけですか?
ありがとう。

アップデート

生成されたものをチェックした後、ツリーのすぐ下でこれを見つけhtmlたので、問題を見つけたと思うかもしれません。その中の値は、選択されたidコンポーネントだったようです。一部またはツリーノードにチェックを入れたり外したりした後、その中の値がいっぱいになったり消えたりします。firebuginput hidden

<input type="hidden" id="Position:tView:j_idt110_selection" name="Position:tView:j_idt110_selection" value="null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0_0,0_1,0_2,0_3,0_4,0_5,4,4_0,4_1,4_2,6,6_0,6_0_0,6_0_1,6_0_2,6_0_3,6_0_4,6_1,6_1_0,6_1_0_0,6_1_0_1,6_1_0_2,6_1_0_3,6_1_0_4,6_1_0_5,6_1_0_6,6_1_1,6_1_2,6_1_3,6_1_4,6_1_5,6_1_6,6_1_7,6_1_8,6_1_9,6_1_10,6_1_11,6_1_12,6_1_13,6_1_14,6_1_15,6_1_16,6_1_17,6_2,6_2_0,6_2_0_0,6_2_0_1,6_2_1,6_2_2,6_2_3,6_2_4,6_2_5,6_2_6,6_2_6_0,6_2_6_1,6_2_6_2,6_2_7,6_3,6_3_0,6_3_1,6_3_2,6_4,6_4_0,6_4_1,6_4_2,6_4_3,6_4_3_0,6_4_3_1,6_4_3_2,1,1_0,1_0_0,1_0_1,1_0_2,1_1,1_1_0,1_1_1,1_1_2,1_1_3,2,2_0,2_0_0,2_0_1,2_0_2,2_0_3,2_0_4,2_0_5,2_1,2_1_0,2_1_1,2_1_2,2_1_3,2_1_4,2_1_5,2_1_6,2_1_7,2_2,3,3_0,3_1,3_2,3_3,3_3_0,3_3_1,5,5_0,5_0_0,5_0_1,5_0_2,5_0_3,5_0_4,5_0_5,5_1,5_1_0,5_1_1,5_1_2,5_1_3,5_1_4,5_1_5,5_2,5_2_0,5_2_1,5_2_2,5_2_3,5_2_4,5_3,5_3_0,5_3_1,5_3_2,5_3_3,5_3_4,5_3_5,5_3_6,5_4">

私の編集方法を示します:

public void editingPosition(final Position pList) {
        position = pList;

        List<PrivilageuserDefault> defaults = privilageuserDefaultFacadeLocal.findPrivilageuserDefaultByPositionid(position.getPositionid());
        positionPrivilegesMap = privilageuserDefaultFacadeLocal.searchMapPrivilegeUserDefault(position.getPositionid());

        if (!defaults.isEmpty()) {
            PrivilageuserDefault[] arrayOfPositionPrivileges = defaults.toArray(new PrivilageuserDefault[defaults.size()]);

            int i = 0;
//                this.selectedTreeMenu = new TreeNode[defaults.size()]; --> commented on 2nd update
            for (PrivilageuserDefault pd : arrayOfPositionPrivileges) {
//                    TreeNode node = new DefaultTreeNode(pd.getMenu(), null); --> commented on 2nd update
//                    this.selectedTreeMenu[i] = node; --> commented on 2nd update
                i++;
            }

            checkTreeNodes(menuTree);
        }

        status = 2;
    }

これは、存在する場合はツリーにチェックを入れます:

private void checkTreeNodes(TreeNode root) {
        if (root.getChildCount() > 0) {
            for (TreeNode children : root.getChildren()) {
                Menu menu = (Menu) children.getData();
                if (positionPrivilegesMap.containsKey(menu.getMenuid())) {
                    children.setSelected(true);
                }

                // recursive check
                checkTreeNodes(children);
            }
        }
    }

ツリーのチェック/チェック解除に関するCRUDの概念が間違っているか、いくつかの手順が欠落していると思います。

アップデート

ええ、私は正しかったnullです。上記の非表示の入力からの値は、selectedTreeMenu 変数でした。selectedTreeMenu を埋める行にコメントを付けた後 (上記のスニペットのコメント行を更新しました)、データベースからデータを取得できるようになり、ツリーで選択されたノードがチェックされました。しかし、選択したノードをチェック/チェック解除せずに選択したツリーをすぐに更新した後、正常に更新されましたが、選択したノードは更新/データベースへの挿入/削除されませんでした。そうです、それだけでは十分ではありませんでした

children.setSelected(true);

selectedTree 変数も入力する必要があるようですが、それを正しく行うにはどうすればよいでしょうか? :/

4

2 に答える 2

0

PrimeFaces 5.3 で直面していた問題を指摘してくれてありがとう。私の場合、rowKeyプログラムで子を追加したときに設定されていませんでした。rowKey区切り記号と子カウントを現在のノードの に追加するだけでコードに を設定することで、これを回避できrowKeyます。

public abstract class TreeNodeWrapper<T extends Serializable>
    implements Serializable, TreeNode
{
    ...

    public TreeNodeWrapper<T> addChild(String name)
    {
        T clone = cloneEntity(name);
        ...
        TreeNodeWrapper<T> childNode = newInstance(clone ...);
        String rowKeyFix = getRowKey();
        if (rowKeyFix != null) {
            rowKeyFix += "_" + this.children.size();
            childNode.setRowKey(rowKeyFix);
        }
        this.children.add(childNode);
        return childNode;
    }
}
于 2016-02-08T16:43:06.063 に答える
0

最後に、いくつかの回避策、クイック パッチを見つけました。新しいList変数を作ります

private List<TreeNode> selectedTreeList;

それをノードで埋めます

private void checkTreeNodes(TreeNode root) {
        if (root.getChildCount() > 0) {
            for (TreeNode children : root.getChildren()) {
                Menu menu = (Menu) children.getData();
                if (positionPrivilegesMap.containsKey(menu.getMenuid())) {
                    children.setSelected(true);
                    expand(children);
                    selectedTreeList.add(children); // --> filled with this
                }

                // recursive check
                checkTreeNodes(children);
            }
        }
    }

UIに表示する前に、ノードのListtoを変更しますArray

selectedTreeMenu = selectedTreeList.toArray(selectedTreeMenu);

そして出来上がり!

于 2013-12-05T10:34:27.343 に答える