我正在开发一个需要转换为遵循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方法中的内容,因此我得到了一个异常。
这应该是预期的吗?我错过了什么吗?转换器如何在具有view-params的应用程序流中工作?
编辑:经过一些搜索,我发现getAsObject
在调用viewScopedBean
而不是{{{{}}}之后接收toString
的{{1}}作为字符串参数的原因1}}转换。这种情况正在发生,因为一旦我的提交完成,重定向就会发生,并且不会呈现HTML,因此actionClass.submit
不会呈现,因此getAsString
的字符串代表是其<f:viewParam>
返回值。