【问题标题】:Write to a map property in an h:inputText in h:dataTable写入 h:dataTable 中的 h:inputText 中的地图属性
【发布时间】:2014-02-22 17:46:22
【问题描述】:

我想添加一个输入文本,用户可以在其中编辑h:dataTable 中的数量

<h:dataTable id="checkout_table" value="#{cartController.cart.entrySet()}"
    var="item" >
    <h:column>
        <f:facet name="header">Movie</f:facet>
        #{item.key.title} - #{item.key.getAvailable()}
    </h:column>
    <h:column>
        <f:facet name="header">Quantity</f:facet>
        <h:inputText id="quantity"
            value="#{item.value}" redisplay="true"
            converterMessage="Please provide an integer" required="true"
            requiredMessage="Please enter a quantity">
            <!-- <f:validateLongRange minimum="1"
                maximum="#{item.key.getAvailable()}" />
                    this validation must be performed on set-->
            <f:ajax event="blur" render="quantityMessage" />
        </h:inputText>
    </h:column>
    <h:column><h:commandButton value="edit"
        action="#{cartController.addMovieToCart(item.key, item.value)}" />
    </h:column>
    <h:column><h:commandButton value="delete"
        action="#{cartController.removeMovie(item.key)}" />
    </h:column>
    <h:column><h:message id="quantityMessage" for="quantity" /></h:column>
</h:dataTable>

现在抛出异常The class 'java.util.LinkedHashMap$Entry' does not have a writable property 'value'。我已经阅读了有关装订的各种内容,但无法完全理解它们。我应该怎么做才能为这个输入字段定义一个 getter 和 setter?我可以使用其他组件吗?

如果验证也可以处理,那将不胜感激!

编辑:在@BalusC 回答之后,我设法读取和写入地图 - 需要注意的是 - 我在 bean 中获得了 CCE java.lang.String cannot be cast to java.lang.Integer

private Map<Movie, Integer> cart = new LinkedHashMap<>();

public String addMovieToCart(Movie movie, Integer quantity) {
    if (quantity > movie.getAvailable()) {
        String message = "Available copies are " + movie.getAvailable();
        FacesContext.getCurrentInstance().addMessage(null,
            new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
        return null;
    }
    Integer ordered = cart.get(movie); // CCE here !
    // etc
}

这个问题终于解决了:

<h:inputText id="quantity"
    value="#{cartController.cart[item.key]}"
    converterMessage="Please provide an integer" required="true"
    requiredMessage="Please enter a quantity" converter="javax.faces.Integer">

注意转换器 - 显然 JSF 将地图元素转换为 String ?必须显式转换为整数

没有全方位的验证虽然看起来很困难(由于渲染/查看时间)

【问题讨论】:

    标签: jsf jsf-2.2


    【解决方案1】:

    如果你想在 EL 中有一个可写的 Map 值,那么你需要大括号表示法
    #{map[entry.key]},其中你将键作为另一个变量传递。 #{entry.value} 确实不起作用,因为这是只读的,如异常所示。

    因此,在您的特定情况下应该这样做:

    <h:dataTable value="#{cartController.cart.entrySet()}" var="item">
        ...
        <h:inputText ... value="#{cartController.cart[item.key]}" />
    

    至于验证者,这个答案适用:Using validator with a variable attribute in ui:repeat

    顺便说一下,&lt;h:inputText&gt; 不支持 redisplay 属性。也许您对&lt;h:inputSecret&gt; 感到困惑?

    【讨论】:

    • 我也有一个 CCE,我也解决了(见编辑) - 基本上它是将值转换为字符串而不是整数 - 奇怪的事情
    猜你喜欢
    • 1970-01-01
    • 2012-02-03
    • 2019-02-04
    • 1970-01-01
    • 2011-06-05
    • 2015-01-17
    • 2013-03-31
    • 2013-05-11
    • 2011-01-26
    相关资源
    最近更新 更多