我有一个视图范围的托管bean,其托管属性绑定到querystring参数。JSF给了我一个熟悉的例外:
javax.faces.FacesException:
Property reset references object in a scope with shorter lifetime than the target scope session
例如:
<managed-bean>
<managed-bean-name>userBean</managed-bean-name>
<managed-bean-class>project.UserBean</managed-bean-class>
<managed-bean-scope>view</managed-bean-scope>
<managed-property>
<property-name>reset</property-name>
<value>#{param['reset']}}</value>
</managed-property>
</managed-bean>
有解决这个问题的办法吗?
这是经过设计的。托管属性的作用域不能比托管bean本身的作用域窄。托管属性仅在bean的构建过程中设置(在您的情况下,这是视图的开始),但在同一视图范围内的任何后续请求中,请求参数可能不再有效,并且bean可能处于无效状态。这种设计限制防止了这种情况的发生。
无论如何,要实现特定的功能需求,只需使用<f:viewParam>
即可。
<f:metadata>
<f:viewParam name="reset" value="#{userBean.reset}" />
</f:metadata>
另请参阅:
- ViewParam与@ManagedProperty(值="#{param.id}")