java.lang.IllegalAccessException:类javax.el.BeanELResolver无法使用修饰符“public”访问类java.util.Arrays $ ArrayList的成员

时间:2015-08-07 09:41:09

标签: jsf jsf-2 el

我有一个p:selectManyCheckbox,它可以正常工作:

<p:selectManyCheckbox id="groups" value="#{myBean.selectedGroups}">
    <f:selectItems value="#{myBean.myGroups}" var="group" itemValue="#{group.id}" itemLabel="#{group.name}"/>
</p:selectManyCheckbox>

现在我必须将其转换为Tree组件(将Group parent添加到数据),但我的PrimeFaces版本为3.4.1。不支持这样的功能。为了更好地进行自定义,我决定使用html和<ui:repeat>手动创建这个selectManyCheckbox:

<div id="j_idt25groups" class="ui-scrollpanel ui-scrollpanel-native ui-widget ui-widget-content ui-corner-all" style="height: 200px;">
    <table id="groups" class="ui-selectmanycheckbox ui-widget">
        <tbody>
            <ui:repeat value="#{myBean.myGroups}" var="group" varStatus="status">
                <tr>
                    <td>
                        <div class="ui-chkbox ui-widget">
                            <div class="ui-helper-hidden-accessible">
                                <ui:fragment rendered="#{myBean.selectedGroups.contains(group.id)}">
                                    <input id="groups:#{status.index}" name="groups" type="checkbox" value="#{group.id}" 
                                                       checked="checked">
                                    </input>
                                </ui:fragment>
                                <ui:fragment rendered="#{not myBean.selectedGroups.contains(group.id)}">
                                    <input id="groups:#{status.index}" name="groups" type="checkbox" value="#{group.id}">
                                    </input>
                                 </ui:fragment>
                             </div>
                             <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default">
                                  <span class="ui-chkbox-icon"></span>
                             </div>
                         </div>
                     </td>
                     <td>
                        <label for="groups:#{status.index}">#{group.name}</label>
                    </td>
                </tr>
            </ui:repeat>
        </tbody>
    </table>
</div>

现在我对此代码#{prpBean.selectedGroups.contains(group.id)}

有疑问
java.lang.IllegalAccessException: Class javax.el.BeanELResolver can not access a member of class java.util.Arrays$ArrayList with modifiers "public"

有可能解决这个问题吗? 是否存在将此类结构转换为树的更简单方法?

1 个答案:

答案 0 :(得分:5)

Java反射无法立即访问contains()的{​​{1}}方法。这可能是正在使用的EL实现中的(极端情况)错误。它可以在不同的EL实现中工作。可能值得向EL实现供应商提供错误报告,但它就是它。

创建java.util.Arrays$ArrayList时,请使用selectedGroups代替new ArrayList(),一切顺利。