是的你可以。您只需要提供一个转换器,它可以在后面的对象类型的字符串表示形式#{myBean.name}
和真实对象之间进行转换。字符串表示通常是所讨论对象的唯一技术/自然标识符。比如表的PK。它必须是字符串,因为 HTTP 请求参数只能是字符串。您不能在 URL 中传递复杂的 Java 对象。URL 只是字符串。
这是一个启动示例:
例如,初始视图中的以下内容:
<h:link value="Edit" outcome="edit">
<f:param name="id" value="#{personViewer.person.id}" />
</h:link>
(生成一个<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 />
用这个转换器
@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));
}
}
(过于简单化;省略了所有空/数字检查,但你明白了)
也可以看看:
根据评论更新,您实际上想要触发 POST 请求。你根本不需要<f:viewParam>
。它仅用于设置/验证/转换 GET 请求参数。尝试序列化整个对象也毫无意义。只需使用@ManagedProperty
.
例如
@ManagedBean
@ViewScoped
public class PersonEditor implements Serializable {
@ManagedProperty("#{personViewer.person}")
private Person person;
// ...
}
它不再是可收藏的,而且对 SEO 不友好(但这就是 POST 的本质,你可能早就意识到了这一点)。请注意,#{personViewer}
bean 本身也必须是@ViewScoped
(因此不是@ReqestScoped
)。您还需要确保您不会通过重定向返回,而只是向前导航。