powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF передача объекта в метод
22 сообщений из 22, страница 1 из 1
JSF передача объекта в метод
    #38461780
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, у меня есть JSF страница редактирования свойств некоторого объекта(item):
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 
                <f:metadata>
                    <f:viewParam name="id" value="#{helper.item}"
                    converter="#{itemConverter}"                    />
                </f:metadata>    
                <h:form>

                    <h:outputText value="Наименование:" />  
                    <h:inputText value="#{helper.item.name}" ></h:inputText> 
    
                    <p:commandButton value="Сохранить" action="#{myService.save(helper.item)}"/>

                </h:form>

Это работает. helper это SessionScoped бин. Во первых, я не понимаю почему это не работает без helper, если сделать item SessionScoped. Вот так:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 
                <f:metadata>
                    <f:viewParam name="id" value="#{item}"
                    converter="#{itemConverter}"                    />
                </f:metadata>    
                <h:form>

                    <h:outputText value="Наименование:" />  
                    <h:inputText value="#{item.name}" ></h:inputText> 
    
                    <p:commandButton value="Сохранить" action="#{myService.save(item)}"/>
</h:form>

Во вторых, я не могу сделать так, чтобы это работало для создания нового item, без указания id. Что бы я ни делал, в myService.save приходит девственно чистый item. Подскажите пожалуйста, как это сделать.
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38461877
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
с h:commandButton работает или то же самое?
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38461897
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,
да, то же самое
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38461910
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте var="item1", то есть отличное от имени класса
было подобное всегда приходили новые объекты, юзал eclipselink
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38461918
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breath, куда var воткнуть?
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38461925
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, var вместо value увидел
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38461962
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я сейчас уже подробности не помню, но тут скорее всего дело в первоначальной инициализации бина - при первом обращении он еще не сохранен в сессии. В свое время решал с помощью f:event, примерно так (тут, правда, параметр простое число, но для объектов аналогично):
Код: html
1.
2.
3.
4.
<f:metadata>
	<f:viewParam name="clientId" />
	<f:event type="preRenderView" listener="#{client.preload(clientId)}" />
</f:metadata>


Заодно решается проблема создания нового объекта (в параметре передаем 'new')
Код: java
1.
2.
3.
4.
5.
6.
7.
public String preload(String clientId) {
	if (empty(clientId)) return error("неправильный параметр в запросе");
	if (clientId.equals("new")) return add(); // инициализируем новый объект
	// иначе загружаем из базы
	Long id = Long.valueOf(clientId);
	return load(id);
}
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38461971
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,при первом обращении он еще не сохранен в сессииНу да, но при втором то сохранен. Но в save все равно приходит чистым.
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38462073
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
покажите что происходит в #{itemConverter}
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38462138
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra, ничего особенного не происходит, null возвращает если не находит объект с заданным id
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
@Named("itemConverter")
@SessionScoped
public class ItemConverter implements Converter, Serializable {

    @Inject
    private myService ms;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null ) {
            return null;
        }
              
        return ms.getItembyId(Long.valueOf(value));
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (value != null) {
            Item item = (Item) value;
            return item.getId()!=null?String.valueOf(item.getId()):null;
        }
            return null;
        
    }

}
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38462256
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в данном случае функция getAsObject никак не связывает полученный результат с бином, сохраненным в сессии.
Нужно либо найти его в сессии и заменить значения полей:
Код: java
1.
2.
3.
	ELContext elctx = context.getELContext();
	Object item=elctx.getELResolver().getValue(elctx, null, "#{item}");
	// и дальше что-то делаем, например, заполняем поля бина с помощью рефлексии


либо заменить сам бин в сесси с помощью elctx.getELResolver().setValue.
Но проще было бы передать управление в метод самого бина через f:event (f:viewAction начиная с jsf 2.2)
Или еще можно инжектить с помощью CDI - вариантов много
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38462291
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в данном случае функция getAsObject никак не связывает полученный результат с бином, сохраненным в сессии. Даже если я уберу вообще оттуда конвертер, и всю секцию <f:metadata>, в save все равно попадает чистый item. я буду видеть свойства этого item, если перегружу страницу, но он не передается в метод. С хелпером тоже магия, почему без него не работает?
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38462685
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
похоже, понятно в чем дело. А покажите аннотации бина #{item}, желательно с полным названием класса.
Конкретно, интересует, там
Код: java
1.
2.
3.
@javax.enterprise.context.SessionScoped
или
@javax.faces.bean.SessionScoped


и какая вторая аннотация
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38462834
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,
Код: java
1.
2.
@javax.enterprise.context.SessionScoped
@javax.inject.Named("Item")
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38462924
vladimir.nal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я может чего не понимаю , но для чего передавать с помощью :
<p:commandButton value="Сохранить" action="#{myService.save(item)}"/>
сессионный бин ? !!!!
он и так доступен из любого другого бина !

сделай в myService :
@ManagedProperty(value="#{item}")
private Item item;
public void setItem(Item item) {
this.item = item;
}

И this.item - у тебя будет содержать этот бин , со всеми изменениями, которые внесены на странице !
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38462925
vladimir.nal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если нужен бин не сессионный, то поставь ему ViewScope
Он так же будет доступен из любого метода вызванного и этой страницы
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38462927
vladimir.nal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так же, насколько я понимаю, любой сессионный бин можно достать из сессиии :
final FacesContext facesContext = FacesContext.getCurrentInstance();
(ItemBean) facesContext.getApplication()
.getVariableResolver().resolveVariable(
facesContext,
"ItemBean");
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38463126
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimir.nal,Я может чего не понимаю , но для чего передавать с помощью :
<p:commandButton value="Сохранить" action="#{myService.save(item)}"/>
сессионный бин ? !!!! Затем что этих бинов больше одного, save работает с любым, и если есть возможность не менять сервис при добавлении очередного бина, я предпочел бы этого не делать, и руками в контекст не лезть. И сессионный бин только в этом примере, может быть и другой.
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38463185
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javapeckerivanra,
Код: java
1.
2.
@javax.enterprise.context.SessionScoped
@javax.inject.Named("Item")


Остается проверить аннотации myService. Но если во всех бинах такая комбинация - умываю руки, должно работать. Было предположение, что перепутаны jsf и cdi SessionScoped.
Разве что кроме аннотаций используются бины, сконфигурированные в xml (так как "этих бинов больше одного"), и ошибка там.
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38463200
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra, Было предположение, что перепутаны jsf и cdi SessionScoped. Я тоже так подумал, но все было на CDI. Поменял все на JSF, стало работать. Но так ведь быть не должно, в xml ничего не конфигурировал.
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38463204
vladimir.nal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javapeckervladimir.nal,Я может чего не понимаю , но для чего передавать с помощью :
<p:commandButton value="Сохранить" action="#{myService.save(item)}"/>
сессионный бин ? !!!! Затем что этих бинов больше одного, save работает с любым, и если есть возможность не менять сервис при добавлении очередного бина, я предпочел бы этого не делать, и руками в контекст не лезть. И сессионный бин только в этом примере, может быть и другой.

Бинов больше одного может быть только в коллекции.
Соответственно эта коллекция принадлежит другому бину или сервису.

Так и поставь этому бину ViewScope
это и будет эквивалентно его передаче через :
<p:commandButton value="Сохранить" action="#{myService.save(item)}"/>

Или у тебя метод myService.save - женерик ?
...
Рейтинг: 0 / 0
JSF передача объекта в метод
    #38463228
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimir.nal,авторБинов больше одного может быть только в коллекции. Я имею ввиду не количество, а то что у меня несколько разных бинов.Или у тебя метод myService.save - женерик ?Нет, просто Object принимает.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF передача объекта в метод
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]