我正在开发一个需要转换为遵循 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.submit
getAsString
<f:viewParam>
viewScopedBean
toString