Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 从ViewScope bean添加的FacesMessage未呈现_Jsf_Jakarta Ee_Jsf 2 - Fatal编程技术网

Jsf 从ViewScope bean添加的FacesMessage未呈现

Jsf 从ViewScope bean添加的FacesMessage未呈现,jsf,jakarta-ee,jsf-2,Jsf,Jakarta Ee,Jsf 2,我有一个具有以下方法的ViewScope bean: public Item getItem() { try { itemID = Integer.parseInt( FacesContext.getCurrentInstance().getExternalContext() .getRequestParameterMap().get("itemID")); } catch

我有一个具有以下方法的ViewScope bean:

public Item getItem()  
{
     try {
          itemID = Integer.parseInt(
             FacesContext.getCurrentInstance().getExternalContext()
                         .getRequestParameterMap().get("itemID"));  
     } catch(NumberFormatException ex) {
          FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                       FacesMessage.SEVERITY_ERROR, "Item lookup error", null));
          return null;  
     }  
     return itemsDAO.findByID(itemID);
}

该方法采用ViewID参数,并使用
itemsDAO
查找对象。我想通过捕获
NumberFormatException
并将消息添加到其中,从而在itemID不是整数时显示faces消息。然而,这是行不通的。上述代码片段中的
FacesMessage
未在以下视图标记中呈现
h:messages globalonlly=“true”infoClass=“info”errorClass=“error”

我怀疑调用该方法时,
FacesContext
不可用,但我不知道如何处理此异常

更新1:

关于使用viewParam使用内置转换和验证的建议。我不知道这在这种情况下会怎样。itemID是从一个“索引”视图传递的,该视图列出了所有项目,如下所示。每个项目标题都是指向viewItem页面的链接,itemID通过URL传递。在这种情况下,如果索引视图有许多项,如何使用viewParam将itemID传递给viewItem视图

index.xhtml

<code>
 <ui:repeat var="item" value="#{ItemViewBean.items}">
       <div id="item">
        <h:link value="#{item.title}" outcome="viewItem">
        <f:param name="itemID" value="#{item.id}"></f:param>
        </h:link>
        <p><h:outputText value="#{item.description}"></h:outputText> <br />
        Address: <h:outputText value="#{item.address}"></h:outputText></p>
        <span class="itemFooter">
        Submitted By: <h:outputText value="#{item.user.username}"></h:outputText> On
        <h:outputText value="#{item.postDate}"></h:outputText>
        </span>
       <hr />
       </div>
       </ui:repeat>
</code>


地址:

提交人:年月日
更新2:
我为这个问题想出了一个解决办法。如果发生异常,我会将ErrorFacesMessage放在Flash对象中,并重定向到某个错误页面。我仍然不明白为什么不能简单地将FacesMessage添加到FacesContext并显示在视图上。

鉴于您正在遍历
外部上下文#getRequestParameterMap()
,您似乎正在拦截GET请求。假设它发生在getter方法()中,它似乎仅在引用
属性的组件被呈现时执行

因此,假设上述假设为真,那么当在引用
属性的组件之前的视图中声明
组件时,这个问题就会出现。现在向faces上下文添加新消息已经太迟了。
已在该点渲染

我至少想不出与这一具体问题症状相匹配的其他合理原因。基本上有两种解决方案:

  • 移动到引用
    属性的组件之后,以便在添加faces消息后呈现该组件

  • 通过
    在预渲染视图事件期间执行业务作业,最好结合
    将请求参数设置为bean属性。您甚至可以将
    单独与转换器结合使用,因为糟糕的getter方法的唯一任务是转换值

  • 不必说,鉴于您目前基本上滥用/变通了一些基本的JSF概念,因此首选选项2。其中,业务逻辑不属于getter

    例如

    itemConverter
    只是一个
    Converter
    实现,其中请求参数转换为
    getAsObject()
    方法中的
    Item
    实例

    另见:

    您如何知道这确实不起作用?您确定正在调用addMessage方法吗?你有错误吗?您是否正在执行AJAX请求(如果是,则必须更新h:messages)?@elias我知道它不起作用,因为如果我故意在需要整数时将itemID设置为字符串,从而导致异常,则h:messages标记为空。感谢您的详细回答。选项1不起作用,因为我要求消息显示在页面顶部,它不能在我设计的组件下方。对于选项2,请参见“我的更新1”后期编辑,以了解这对于MEA来说是一个怎样的问题。根据您的更新1:将元数据/viewparam放入与结果相关联的页面
    viewItem
    。更多详细示例,请参见“另请参见”链接。根据您的更新2:flash工作,因为消息是在呈现
    之前添加的。不使用flash失败,因为消息是在呈现
    后添加的。正如我在回答中试图解释的那样。谢谢巴卢斯克澄清这一点。我对viewParam标记有一个巨大的误解。这对我有用。感谢您对JSF标签的支持和所有精彩的回答。
    <f:metadata>
        <f:viewParam id="itemID" name="itemID" value="#{bean.item}"
            required="true" requiredMessage="Invalid page access. Please use a link from within the system."
            converter="itemConverter" converterMessage="Unknown item ID."
        />
    </f:metadata>
    <h:message for="itemID" />
    
    private Item item; // +getter +setter