0

我正在开发一个需要转换为遵循 POST-redirect-GET 模式的 Web 应用程序。在这种情况下,需要在重定向中传递视图范围的托管 bean,以便页面仍然可以正常工作。所以为了做到这一点,我在我的 faces-config 中添加了一个导航案例,它将在重定向中传递 view-param

<navigation-rule>
    <from-view-id>page1.xhtml</from-view-id>
    <navigation-case>
        <from-action>#{actionClass.Submit}</from-action>
        <from-outcome>submit</from-outcome>
        <to-view-id>page1.xhtml</to-view-id>
        <redirect>
            <view-param>
                <name>viewScopedBean</name>
                <value>#{actionClass.viewScopedBean}</value>
            </view-param>
        </redirect>
    </navigation-case>
</navigation-rule>

该操作是执行设置 viewScopedBean

在我的 jsf 页面中,我有

<f:metadata>
    <f:viewParam name="viewScopedBean" id="viewScopedBean" 
        value="#{actionClass.viewScopedBean}" converter="customConverter"/>
    <f:event type="preRenderView" listener="#{actionClass.initialize}" />
</f:metadata>

转换器看起来一直在工作(getAsString 返回的字符串被传递给 getAsObject 转换它),除非重定向完成。传入的字符串是 viewScopedBean 的 toString 而不是我的自定义转换器类的 getAsString 方法中所做的,所以我得到了一个异常。

这应该是意料之中的吗?我错过了什么吗?转换器如何在具有视图参数的应用程序流中工作?

编辑:经过一番搜索,我发现为什么在调用而不是转换之后getAsObject接收viewScopedBean'stoString作为其 String 参数。发生这种情况是因为一旦我的提交完成,就会发生重定向并且不会呈现 HTML,因此不会呈现,所以我的 String rep是它的返回值。actionClass.submitgetAsString<f:viewParam>viewScopedBeantoString

4

0 回答 0