我试图将一个对象从一个页面传递到另一个页面,其中每个页面都在不同的视图中.
在第一页上我有一个输入文本,其中myBean是ViewScoped Bean,名称是一个对象.
<h:inputText value="#{myBean.name}"/>
第二页包含,
<f:metadata>
<f:viewParam name="userId" value="#{myBean.name}"/>
</f:metadata>
我得到错误转换错误设置值mypackage.myBean@257100b'为'null Converter'.我们可以传递String值以外的对象来查看参数吗?
Bal*_*usC 11
是的你可以.您只需提供一个转换器,它在后面的对象类型的字符串表示#{myBean.name}和真实对象之间进行转换.字符串表示通常是所讨论对象的唯一技术/自然标识符.例如,表的PK.它必须是一个字符串,因为HTTP请求参数只能是字符串.您无法在URL中传递复杂的Java对象.网址只是字符串.
这是一个启动示例:
例如,初始视图中的以下内容:
<h:link value="Edit" outcome="edit">
<f:param name="id" value="#{personViewer.person.id}" />
</h:link>
Run Code Online (Sandbox Code Playgroud)
(产生一个<a href="edit.xhtml?id=123">Edit</a>)
以及链接视图中的以下内容:
<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 />
Run Code Online (Sandbox Code Playgroud)
用这个转换器
@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));
}
}
Run Code Online (Sandbox Code Playgroud)
(过度简化;省略所有空/数字检查,但你明白了)
根据评论更新,您实际上想要触发POST请求.你根本不需要<f:viewParam>.它仅用于设置/验证/转换GET请求参数.尝试序列化整个对象也没有任何意义.只是用@ManagedProperty.
例如
@ManagedBean
@ViewScoped
public class PersonEditor implements Serializable {
@ManagedProperty("#{personViewer.person}")
private Person person;
// ...
}
Run Code Online (Sandbox Code Playgroud)
它只是不再加入书签而不是SEO友好(但这是POST的本质,你可能已经很久才意识到这一点).请注意,#{personViewer}bean本身也必须@ViewScoped(因此不是@ReqestScoped).您还需要确保不使用重定向导航回来,而只需向前导航.