迭代从JSF页面中的查询获得的实体的ArrayList

时间:2014-10-28 23:48:48

标签: jsf jsf-2 arraylist foreach entities

我有一个托管bean作为我的View,其中我有一个名为List<ArrayList> getImages()的方法,我在其中查询数据库并获取该方法返回的实体列表。一切都很好。

我的问题是,当我尝试使用<c:forEachui:repeat从JSF迭代此列表时,例如<c:forEach var="image" items="#{viewBean.images}">服务器,Tomee抛出异常java.lang.UnsupportedOperationException: Result lists are read-only。而且我现在甚至没有对这些值做任何事情。

如果我只是用简单的对象返回ArrayList,没问题。我理解它必须与对象是一个实体因此绑定到数据库这一事实有关,但我不确定正确的方法或最佳实践,以返回我需要的JSP页面。

感谢。 杰森。

编辑。下面是用于从db中检索对象以便在JSF中进行迭代的方法。

public List<ProfileImage> getProfileImageList() { profileImageList = facade.findAllByProfileId(1L); while (profileImageList.size() < 4) { // Add placeholders to bring the list size to 4 ProfileImage placeHolder = new ProfileImage(); placeHolder.setProfileId(1L); profileImageList.add(placeHolder); } return Collections.unmodifiableList(profileImageList); }

下面的JSF片段:注意,我现在没有对var的值进行任何操作

<ui:repeat value="${imageUploadView.profileImageList}" var="profileImage">
    <p:commandButton id="imageBtn_1" value="Picture 1" type="button" />
    <p:overlayPanel id="imagePanel_1" for="imageBtn_1" hideEffect="fade" >
        <ui:include src="/WEB-INF/xhtml/includes/profile_imageupload.xhtml" />
    </p:overlayPanel>
</ui:repeat>

生成以下错误

javax.el.ELException: Error reading 'profileImageList' on type com.goobang.view.ImageUploadView

viewId=/profile/create_profile.xhtml
location=/Users/xxxxxxxxx/Documents/NetBeansProjects/testmaven/target/testmaven-1.0-SNAPSHOT/profile/create_profile.xhtml
phaseId=RENDER_RESPONSE(6)

Caused by:
java.lang.UnsupportedOperationException - Result lists are read-only.
at org.apache.openjpa.lib.rop.AbstractResultList.readOnly(AbstractResultList.java:44)

/profile/create_profile.xhtml at line 16 and column 87 value="${imageUploadView.profileImageList}"

1 个答案:

答案 0 :(得分:1)

我已经解决了。抛出异常是因为我在将列表分配给结果集后修改了列表。如果我只是返回结果集一切都很好。因此,为了实现我在getProfileImageList()中的意图,我按照tt_emrah的建议从原始创建了一个新的ArrayList,然后在返回之前修改它。

public List<ProfileImage> getProfileImageList() {
    profileImageList = new ArrayList(facade.findAllByProfileId(1L));
    while (profileImageList.size() < 4) { // Add placeholders to bring the list size to 4 
        ProfileImage placeHolder = new ProfileImage();
        placeHolder.setProfileId(1L);
        profileImageList.add(placeHolder);
    }
    return profileImageList;
}