Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 JSF2.0传递对象的视图参数_Jsf 2_Viewparams - Fatal编程技术网

Jsf 2 JSF2.0传递对象的视图参数

Jsf 2 JSF2.0传递对象的视图参数,jsf-2,viewparams,Jsf 2,Viewparams,我试图将一个对象从一个页面传递到另一个页面,其中每个页面都位于不同的视图中 在第一个页面上,我有一个输入文本,其中myBean是一个ViewScoped Bean,name是一个对象。 第二页包含, 我得到了错误转换错误设置值mypackage。myBean@257100b'表示“空转换器”。 我们可以传递字符串值以外的对象来查看参数吗 是的,你可以。您只需要提供一个转换器,它可以在{myBean.name}后面的对象类型的字符串表示形式和真实对象之间进行转换。字符串表示通常是相关对象的

我试图将一个对象从一个页面传递到另一个页面,其中每个页面都位于不同的视图中

在第一个页面上,我有一个输入文本,其中myBean是一个ViewScoped Bean,name是一个对象。

第二页包含,



我得到了错误转换错误设置值mypackage。myBean@257100b'表示“空转换器”。
我们可以传递字符串值以外的对象来查看参数吗

是的,你可以。您只需要提供一个转换器,它可以在
{myBean.name}
后面的对象类型的字符串表示形式和真实对象之间进行转换。字符串表示通常是相关对象的唯一技术/自然标识符。例如,表的主键。它必须是字符串,因为HTTP请求参数只能是字符串。不能在URL中传递复杂的Java对象。URL只是字符串

以下是一个启动示例:

例如,初始视图中的以下内容:

<h:link value="Edit" outcome="edit">
    <f:param name="id" value="#{personViewer.person.id}" />
</h:link>
(过于简化;省略了所有空/数字检查,但您知道了)

另见:

更新根据评论,您实际上想要发出POST请求。您根本不需要
。它仅用于设置/验证/转换GET请求参数。试图序列化整个对象也毫无意义。只需使用
@ManagedProperty

例如


这不仅不再是书签,也不利于搜索引擎优化(但这是帖子的本质,你可能早就意识到了这一点)。注意,
{personViewer}
bean本身也必须是
@ViewScoped
(因此不是
@requestscope
)。您还需要确保不使用重定向返回,而只是向前导航。

顺便说一句,在没有转换器的
中使用该值是非常令人困惑的。在提交带有该字段的POST表单时,您会遇到完全相同的问题。感谢BaluCs的快速回复。我们可以仅通过来自另一个视图范围bean的POST将接收的值设置为managedProperty(另一个视图范围bean)。您不能通过
@ManagedProperty
在视图范围的bean中设置请求参数。另请参阅答案底部的“请参阅”文章链接。我们正在尝试序列化和反序列化viewParam中传递的对象。但问题是调用的是getAsObject,而不是getAsString。因此,我们为myBean添加了一个单独的toString方法。参数值也显示在URL中。有没有办法隐藏这个参数?所以你只是想要一个帖子?那么您根本不需要
。连载毫无意义。
用于设置GET请求参数。对于POST,只需使用引用初始bean的
@ManagedProperty
。另请参阅更新后的答案。我们需要在第一页中使用第二页中的值。如果我们只做了一个post,并像您上面提到的那样为初始bean提供ManagedProperty,则person id为空。如果我在第二页添加f:metadata标记和相应的代码,并添加转换器,我们可以在第二页中看到值。如果我们不将该类转换为toString,则会发生一个错误,声明person不能设置为PersonEdit bean。那么,有没有一种方法可以在转换器中调用toString方法,或者其他更好的方法?
<f:metadata>
    <f:viewParam name="id" value="#{personEditor.person}"
        converter="#{personConverter}" converterMessage="Bad request. Unknown person."
        required="true" requiredMessage="Bad request. Please use a link from within the system."
    />
</f:metadata>
<h:messages />
@ManagedBean
@RequestScoped
public class PersonConverter implements Converter {

    @EJB
    private PersonService personService;

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return String.valueOf(((Person) value).getId());
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return personService.find(Long.valueOf(value));
    }

}
@ManagedBean
@ViewScoped
public class PersonEditor implements Serializable {

    @ManagedProperty("#{personViewer.person}")
    private Person person;

    // ...
}