0

我想用 sql 查询从数据库中提取的值填充 selectOneMenu 组件。查询仅返回我想作为值输入到 selectOneMenu 的商店名称

我得到 java.lang.IllegalArgumentException 堆栈开始于:

java.lang.IllegalArgumentException  at         com.sun.faces.renderkit.SelectItemsIterator.initializeItems(SelectItemsIterator.java:216)
at com.sun.faces.renderkit.SelectItemsIterator.hasNext(SelectItemsIterator.java:135)
at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:762)

这是我的 xhtml 代码(这是 selectItems 的唯一用途):

<h:selectOneMenu id="storeName"   value="#{shoplist.store}">  
   <f:selectItems value="#{buyHistory.stores}" />
</h:selectOneMenu>

这是来自 buyHistory bean 的查询:

public ResultSet getStores() throws SQLException {
...
PreparedStatement getStores = connection.prepareStatement( 
                "SELECT distinct STORE_NAME  "
                + "FROM BuyingHistory ORDER BY STORE_NAME");
CachedRowSet rowSet = new com.sun.rowset.CachedRowSetImpl();
rowSet.populate(getStores.executeQuery());
return rowSet;
}

我究竟做错了什么?我应该以某种方式从 resultSet 转换为 SelectItem 数组/列表吗?

4

2 回答 2

1

我应该以某种方式从 resultSet 转换为 SelectItem 数组/列表吗?

是的,这是解决方案之一。另请参阅我们的h:selectOneMenuwiki 页面。当值不是、 或数组、 或的IllegalArgumentException实例时,将抛出。SelectItemIterableMap

最终,您的 JSF 支持 bean 应该完全没有java(x).sql依赖关系。import java(x).sql.Something;即你的JSF 代码中不应该有一行。否则,无论如何它都是糟糕的设计(紧耦合)。了解如何创建适当的 DAO 类。

于 2013-08-27T12:31:16.087 回答
1

为什么您认为 JSF 会知道如何从持久层转换 ResultSet?JSF 是一个表示层框架 :)

是的,您需要将其转换为这样的 SelectItem-List:

private List<SelectItem> transformToSelectItems(ResultSet resultSet) {
    List<SelectItem> selectItems = new ArrayList<SelectItem>();

    while(resultSet.next()) {
        String storeName = resultSet.getString("STORE_NAME");
        SelectItem item = new SelectItem(storeName, storeName);
        selectItems.add(item);
    }

    return selectItems;
}

请务必注意 BalusC 的回答。这只是一个如何构造动态 SelectItem-List 的示例。但是您的 JSF-ManagedBeans 中绝对不应该有 ResultSet。

于 2013-08-27T12:31:33.297 回答