【发布时间】: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 ?必须显式转换为整数
没有全方位的验证虽然看起来很困难(由于渲染/查看时间)
【问题讨论】: