【发布时间】:2019-02-20 18:53:35
【问题描述】:
我的 JSF 页面中有一个简单的表单,如下所示:
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<f:view>
<h:head>
<f:metadata>
<f:viewParam name="cities" value="#{myBean.cities}" />
</f:metadata>
</h:head>
<h:body>
<h:form>
<h:messages id="messages" />
<h:selectManyCheckbox value="#{myBean.cities}" label="Select City" >
<f:selectItems value="#{myBean.allCities}" />
</p:selectManyCheckbox>
<h:commandButton value="Submit">
<f:ajax execute="@form" render="output"/>
</h:commandButton>
</h:form>
<h:panelGroup id="output">
Number of Selected Cities: #{myBean.cities.size()}
</h:panelGroup>
</h:body>
</f:view>
</html>
匹配的支持bean:
使用以下 bean 方法:
@Named
@RequestScoped
public class MyBean {
private List<String> cities = new ArrayList<>();
public List<String> getCities() {
return cities;
}
public void setCities(List<String> cities) {
this.cities = cities;
}
public List<String> getAllCities() {
return new ArrayList<>(Arrays.asList(new String [] {
"Los Angeles",
"St. Louis",
"San Francisco",
"Dallas",
}));
}
}
观察:
- 我在
getCities和setCities方法的入口和出口中添加了日志记录。在刷新 JSF 页面期间,将调用getCities方法。但是,在提交时,setCities永远不会被调用。 - 我在控制台日志中没有看到任何错误或异常(javax.faces.PROJECT_STAGE 在 web.xml 中设置为 DEVELOPMENT)。
- 没有错误被传递给
<h:messages/> - 不会为任何表单输入字段调用 set 方法。该页面的行为“奇怪”。
这个问题似乎与来自commandButton/commandLink/ajax action/listener method not invoked or input value not set/updated 的已接受答案的问题#3 相似,但是对于<p:selectCheckboxMenu>,我没有明显的转换问题。根据文档,它应该能够完美处理List<String>。
所以除了解决明显的问题,我们如何确保与此相关的任何错误都可见,而不是出现这种无声的故障类型?
【问题讨论】:
-
所以只是存在
f:viewParam- 指向与输入相同的Collection类型 bean 属性 - 静默阻止用户输入提交? -
是的。它在第一次渲染时不会失败(当没有提供 GET 参数时),但在提交(ajax)表单时它确实会失败。
标签: jsf