我在Primefaces 10中有一个站点。有一个子网站毛发列出了结果。我想让一个selectManyCheckbox填充一个枚举列表,这会产生一个枚举数组。在一个子网站上它工作,在另一个子网站我做几乎相同的事情(其他枚举(,当我发送表单时,我会收到转换错误。我的xhtml看起来像这样:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
template="../layout.xhtml">
<ui:define name="header">
<div id="header">
Dashboard
</div>
</ui:define>
<ui:define name="main">
<style type="text/css">
.ui-chart {
margin-bottom: 50px;
}
</style>
<h:form id="dashboardForm">
<p:messages id="dashboardErrMsg" globalOnly="true"/>
<p:selectManyCheckbox id="abfSelector" value="#{dashboardHandler.selectedAbfragen}" layout="grid" columns="3" styleClass="grid-checkbox">
<f:selectItems value="#{dashboardHandler.abfragen}" var="abfrage" itemLabel="#{abfrage.name}" itemValue="#{abfrage}"/>
</p:selectManyCheckbox>
<p:commandButton id="showButton" value="Anzeigen" icon="pi pi-search" action="#{dashboardHandler.anzeigen}"/>
<div class="card">
<p:lineChart model="#{dashboardHandler.lineModel}" style="width: 100%; height: 500px;"/>
</div>
</h:form>
</ui:define>
</ui:composition>
豆子看起来是这样的:
@Named("dashboardHandler")
@ViewScoped
public class DashboardHandler implements Serializable {
private List<Abfrage> abfragen = new ArrayList<>();
private Abfrage[] selectedAbfragen;
private LineChartModel lineModel;
@PostConstruct
private void init() {
abfragen = UcmdbAbfTableHandler.getAbfragenBySystem(ReferenceSystem.UCMDB);
createLineModel();
}
public void anzeigen() {
//do some search
}
public List<Abfrage> getAbfragen() { return abfragen; }
public LineChartModel getLineModel() { return lineModel; }
public Abfrage[] getSelectedAbfragen() { return selectedAbfragen; }
public void setAbfragen(List<Abfrage> abfragen) { this.abfragen = abfragen; }
public void setLineModel(LineChartModel lineModel) { this.lineModel = lineModel; }
public void setSelectedAbfragen(Abfrage[] selectedAbfragen) { this.selectedAbfragen = selectedAbfragen; }
}
我看不出我的错误为什么会出现类型转换错误。我已经尝试将Abfrage数组更改为List,然后我得到了一个包含Abfrage类名字符串的列表,就像我创建Abfrage.toString((.一样
我也不明白为什么我的信息没有被触发。我总是在我的日志文件中得到错误,其中包含未命名的facesmessage。所以我觉得我在这里也做错了什么。
当selectItems是枚举时,问题在这里得到回答:在h:selectManyCheckbox中使用枚举。
如果selectItems是常规POJO,则需要包含特定的面转换器。关于转换器的StackOverflow有几个答案,比如这个:如何在JSF 2中创建自定义转换器?。Omnifaces是一个JSF实用程序库,包含一个SelectItemsConverter
,它通常可以在无需额外编码的情况下使用。
messages
问题是因为messages标记没有通过commandButton进行ajax更新,或者您可以在messages标记上使用p:autoUpdate
(请参阅PF Showcase(。请注意,messages
不会捕获系统错误,如您所描述的转换错误。为此,您需要在web.xml文件中包含错误页面(例如,请参阅JSF 2.0中的web.xml错误页面(。您还应该捕获并显示ajax错误。(请参见PrimeFaces错误处理(。并确保ProjectStages
上下文参数设置为生产以外的其他内容,例如开发。