Да, вы можете.Вам просто нужно предоставить конвертер, который преобразует строковое представление типа объекта за #{myBean.name}
и реальный объект.Строковое представление обычно является уникальным техническим / естественным идентификатором рассматриваемого объекта.Например, таблица ПК.Это должна быть строка, просто потому, что параметры HTTP-запроса могут быть только строками.Вы не можете передавать сложные объекты Java в URL.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}
должен сам по себе также быть @ViewScoped
(и, следовательно, не @ReqestScoped
).Вы также должны убедиться, что вы не переместились назад с перенаправлением, а просто вперед.