JSF 2.0 просмотр параметров для передачи объектов - PullRequest
1 голос
/ 23 декабря 2011

Я пытаюсь передать объект с одной страницы на другую, где каждая страница находится в отдельном представлении.

На первой странице у меня есть текст ввода, где myBean - это объект ViewScoped, а имяобъект.<h:inputText value="#{myBean.name}"/>

Вторая страница содержит:<f:metadata><f:viewParam name="userId" value="#{myBean.name}"/></f:metadata>

Я получаю значение ошибки Ошибка преобразования mypackage.myBean@257100b 'для' нулевого конвертера '.Можем ли мы передавать объекты, отличные от значений String, для просмотра параметров?

1 Ответ

10 голосов
/ 23 декабря 2011

Да, вы можете.Вам просто нужно предоставить конвертер, который преобразует строковое представление типа объекта за #{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).Вы также должны убедиться, что вы не переместились назад с перенаправлением, а просто вперед.

...