【问题标题】:Why do I get an unexpected TypeConversion error为什么我会收到意外的 TypeConversion 错误
【发布时间】:2021-05-27 17:18:17
【问题描述】:

我在 Primefaces 10 中有一个站点。有一个子站点 fur 列出了结果。我想要一个 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>

bean 看起来像这样:

@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-Array 更改为 List,然后我得到一个包含 abfrage 类名的字符串的列表,就像我制作 abfrage.toString() 时一样。

我也不明白为什么我的消息没有被触发。我总是在我的日志文件中收到带有未处理的面部消息的错误。所以我觉得我在这里也做错了。

【问题讨论】:

    标签: jsf primefaces


    【解决方案1】:

    当 selectItems 是 Enums 时,问题在这里得到解答:Use enum in h:selectManyCheckbox

    当 selectItems 是常规 POJO 时,您需要包含一个特定的 faces 转换器。 StackOverflow 上有几个关于转换器的答案,例如这个:How create a custom converter in JSF 2?。 Omnifaces 是一个 JSF 实用程序库,包含一个 SelectItemsConverter,通常可以现成使用,无需额外编码。

    messages 问题是因为消息标签没有从 commandButton 进行 ajax 更新,或者您可以在消息标签上使用p:autoUpdate(请参阅PF Showcase)。请注意,messages 不会捕获您描述的转换错误等系统错误。为此,您需要在 web.xml 文件中包含错误页面(例如,参见 WEB.XML error-page in JSF 2.0)。您还应该捕获并显示 ajax 错误。 (见PrimeFaces error handling)。并确保 ProjectStages 上下文参数设置为生产以外的其他值 - 例如发展。

    【讨论】:

    • 嗨,谢谢你的回答,但我把 Abfrage 误认为是一个枚举,但它是一个普通的类。我将制作一个普通的 HashMap 并使用它。但是转换错误仍然没有显示。
    • 在这种情况下,您需要包含一个面部转换器。我会相应地更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多