Jsf 如何在两个@ViewScope bean之间共享数据?

Jsf 如何在两个@ViewScope bean之间共享数据?,jsf,jsf-2,Jsf,Jsf 2,我正在尝试将id(long)从一个.xhtml传递到另一个.xhtml。 两个支持bean都是@viewscope,我正试图在它们之间共享长id 我的 com.sun.faces.mgbean.ManagedBeanCreationException:无法创建 管理豆销售订单。发现了以下问题: -表达式{param.foo}request引用的对象的范围比引用的托管bean(saleOrder)视图范围短 我有以下代码 @ManagedBean public class InvoiceV

我正在尝试将id(long)从一个.xhtml传递到另一个.xhtml。 两个支持bean都是
@viewscope
,我正试图在它们之间共享长id

我的

com.sun.faces.mgbean.ManagedBeanCreationException
:无法创建 管理豆销售订单。发现了以下问题: -表达式
{param.foo}
request引用的对象的范围比引用的托管bean(
saleOrder
)视图范围短

我有以下代码

@ManagedBean    
public class InvoiceView{
    private long number;
    // setter getter.
}

@ManagedBean
@ViewScoped
public SearchInvoice{
    private List<InvoiceView> views;
    private InvoiceView selectedView;  // this is coming from <p:dataTable>
}

@ManagedBean
@ViewScoped
public class SaleOrder {

    @ManagedProperty("#{param.foo}")
    private String number;

    @PostConstruct
    public void init(){
       //sysout number;
    }
}
您可以在saleOrder.xhtml中使用
(JSF2),它与视图范围的bean一起工作。
退房。

谢谢回复。我删除了@ManagedProperty并按文档中所述使用,但它为“number”返回null。如果在您的PostConstruct方法中为null,则这是正确的。您需要使用,它将在调用此方法之前设置。我尝试使用与doc相同的方法,但它不起作用。静态值为空。是否将f:元数据放置到saleOrder.xhtml(而不是searchInvoice.xhtml)?searchInvoice.forwardToSaleOrder方法中是否有任何逻辑?如果它只返回“saleOrder.xhtml”字符串,您能否尝试将此命令按钮替换为指向saleOrder视图的h:link(带有嵌套的f:param),并在saleOrder.xhtml中使用它?
{param}
on
@ManagedProperty
需要一个请求范围的JSF托管bean,在您的例子中,它是一个视图范围的bean。如果您仍然希望使用
@ManagedProperty
坚持视图范围的JSF托管bean,那么,您可以获取另一个helper请求范围的JSF托管bean,并将此视图范围的JSF托管bean
SaleOrder
注入该helper请求范围的JSF托管bean,并将参数值设置为其中的视图范围的bean,或者使用
。请分别参阅示例和。我将SaleOrder的作用域更改为“@RequestScoped”,异常被删除,但编号为null。我完全忽略了您在
中嵌入
<代码>用于查询字符串参数,如果您碰巧传递了任何字符串参数。你不能以你在问题中表现出来的方式使用它。在这种情况下,最好使用参数化操作(侦听器)方法(EL 2.2或更高版本)或使用
将该值传递给bean。更换
。(不需要
@ManagedProperty
——只需要一个getter和一个setter来表示数字)。不需要更改bean范围。你可以保持视图范围不变。我也试过了,但没用。我怀疑@PostConstruct init()中是否有“number”可用。
    <!-- I have not desclared <f:metadata/> -->
<h:commandButton value="Place Sale Order"
                 action="#{searchInvoice.forwardToSaleOrder}" <!-- this return saleOrder.xhtml string -->
                 rendered="#{not empty searchInvoice.views}">
        <f:viewParam name="foo" value="#{searchInvoice.selectedView.number}" />
</h:commandButton>