Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Spring + Hibernate + JSF 2.0 
:(
    Опции темы
4epT
Дата 13.4.2011, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



Добрый вечер! Пытаюсь соединить эти три фреймверка =) Расскажу по порядку:

1) Сделал для всех таблиц в БД, отображение на сущности (Entity)
2) Написал Dao классы ... Dao написаны таким образом что есть один базовый Dao:
Код

public class BaseDaoImpl<T extends Serializable> extends HibernateDaoSupport
        implements BaseDao<T> {

    @SuppressWarnings("unchecked")
    final Class entityClass;

    @SuppressWarnings("unchecked")
    public BaseDaoImpl(Class entityClass) {
        this.entityClass = entityClass;
    }

    @Transactional(readOnly = false)
    public void delete(T entity) {
        getSession().delete(entity);
        getSession().flush();
    }
....


От этого класса унаследовано все остальные Dao.
3) Сделал класс userManager, который пока что просто дублирует методы userDao.
4) В настройках спринга все описал ... но поле userDao в классе userManager не инициализируется, и при вызове методы валится NullPointerException.

Вот настройка настройка бинов:
Код

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${hibernate.driverClassName}" />
        <property name="url" value="${hibernate.url}" />
        <property name="username" value="${hibernate.username}" />
        <property name="password" value="${hibernate.password}" />
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:/hibernate.cfg.xml" />
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
        <property name="hibernateProperties">
            <props>
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="txManager" />

    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="baseDaoImpl" class="olly.dao.BaseDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="userDaoImpl" class="olly.dao.UserDaoImpl" parent="baseDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="userManager" class="olly.managers.UserManager">
        <property name="userDao" ref="userDaoImpl" />
    </bean>


А вот класс userManager:
Код

@ManagedBean(name="userController")
@SessionScoped
@Transactional(readOnly = true)
public class UserManager
{
    private UserDaoImpl userDao;

    public UserManager(){
        
    }

    public void setUserDao(UserDaoImpl userDao) {
        this.userDao = userDao;
    }

    public String loginTwo(){

        HttpServletRequest request= (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        HttpSession session = request.getSession();

        User user = userDao.getUserByName(((User)session.getAttribute("user")).getLogin());
...


Подскажите пожалуйста где я ошибся ? Если что то не привел, скажите, допишу ... вроде все упомянул.

Заранее спасибо!  
PM MAIL   Вверх
4epT
Дата 13.4.2011, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



И еще хотел спросить, стоит ли связывать эти три вещи ? До этого начинал писать без спринга, но приходилось самому следить за транзакциями и использовать самописный HibernateUtil
Код

public class HibernateUtil
{

    private static AnnotationConfiguration aconf;

    static {
        try {
            aconf = new AnnotationConfiguration();
            aconf.addAnnotatedClass(User.class);

            Configuration conf = aconf.configure();
             }
           ....
    }

    public static SessionFactory getSessionFactory(){
        return aconf.buildSessionFactory();
    }

PM MAIL   Вверх
emmanuil
Дата 13.4.2011, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: нет
Всего: 3



Цитата(4epT @  13.4.2011,  20:13 Найти цитируемый пост)
И еще хотел спросить, стоит ли связывать эти три вещи ? До этого начинал писать без спринга, но приходилось самому следить за транзакциями и использовать самописный HibernateUtil

Если без спринга то нужен java ee сервер, простым контейнером тут не обойтись наверное.
Цитата(4epT @  13.4.2011,  19:13 Найти цитируемый пост)
Подскажите пожалуйста где я ошибся ? Если что то не привел, скажите, допишу ... вроде все упомянул.

Спринг знает, что нужно что-то делать? Прописан он в web.xml или где там еще нужно?
Попробуйте имя поля такое же как в bean id.
Со спрингом особо не знаком, догадки.
PM MAIL   Вверх
4epT
Дата 13.4.2011, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



Цитата(emmanuil @ 13.4.2011,  22:27)
Если без спринга то нужен java ee сервер, простым контейнером тут не обойтись наверное.

А можно насчет этого поподробнее ?)

В web.xml спринг не прописан ( Пытался прописать там listener, но проект после этого не собирается ...
PM MAIL   Вверх
emmanuil
Дата 13.4.2011, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: нет
Всего: 3



Цитата(4epT @  13.4.2011,  20:45 Найти цитируемый пост)
В web.xml спринг не прописан ( Пытался прописать там listener, но проект после этого не собирается ... 

Причина? Не просто так же. Чего-то не хватает значит. Если не пропишите, то он сам не догадается. ;)
Код

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

Начните пожалуй с этого. Это с грэйлса, но в жсф где-то тоже такое видел.

Цитата(4epT @  13.4.2011,  20:45 Найти цитируемый пост)
А можно насчет этого поподробнее ?)

А что тут подробнее... Обычный java ee стек. JPA, ejb там всякие, транзакции.

В jsf 2.0 думаю можно обойтись без спринга. Но смотря что нужно. JSF это отображение в EE. Сейчас java ee стал проще, навешал аннотаций и работай себе.

Добавлено через 10 минут и 10 секунд
Вот еще:
Код

<listener>
                <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>


Добавлено через 11 минут и 23 секунды
для примера - http://code.google.com/p/mesir/source/brow...ebapp%2FWEB-INF
PM MAIL   Вверх
4epT
Дата 13.4.2011, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



Когда в web.xml прописываешь:
Код

<listener>
                <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener


проект перестает собираться ... в консоли видно вот такое:
Код

start?path=/olly
FAIL - Application at context path /olly could not be started
C:\Documents and Settings\Admin\Мои документы\NetBeansProjects\JSF projects\olly\nbproject\build-impl.xml:696: The module has not been deployed.
BUILD FAILED (total time: 2 seconds)



p.s. у меня работало без спринга, но у меня у проекта была такая архитектура что из jsf бина (ManagedBean) дергался метод какого либо менеджера (в данном примере UserManager). Все менеджеры создавались jsf бине, с областью жизни сессия ... что не очень красиво (менеджеров ожидается порядка 40 штук ... в сессия будет очень много хлама).

Это сообщение отредактировал(а) 4epT - 13.4.2011, 23:30
PM MAIL   Вверх
emmanuil
Дата 13.4.2011, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: нет
Всего: 3



Больше похоже на попытку запуска. В логах сервера смотри доп. инфу.

Цитата(4epT @  13.4.2011,  21:30 Найти цитируемый пост)
p.s. у меня работало без спринга, но у меня у проекта была такая архитектура что из jsf бина (ManagedBean) дергался метод какого либо менеджера (в данном примере UserManager). Все менеджеры создавались jsf бине, с областью жизни сессия ... что не очень красиво (менеджеров ожидается порядка 40 штук ... в сессия будет очень много хлама).

А спринг тут чем поможет? Измени видимость. Есть даже conversation. Определись, какие действия нужны с менеджерами. Тот выполняет только логин, его в request.

Добавлено через 2 минуты и 15 секунд
Есть CDI бины. weld подключи и юзай DI. @Injected нравится? smile
Тогда бины нужно Named помечать.
PM MAIL   Вверх
4epT
Дата 14.4.2011, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



В логах томкэта видно вот такое:
Код

INFO: Unsanitized stacktrace from failed start...
com.sun.faces.config.ConfigurationException: 
  Source Document: jndi:/localhost/olly/WEB-INF/faces-config.xml
  Cause: Unable to find class 'com.sun.facelets.FaceletViewHandler'
        at com.sun.faces.config.processor.AbstractConfigProcessor.createInstance(AbstractConfigProcessor.java:275)


и такое:
Код

Caused by: java.lang.ClassNotFoundException: com.sun.facelets.FaceletViewHandler
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)


PM MAIL   Вверх
4epT
Дата 15.4.2011, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



В общем я разобрался ) вкратце опишу как все сделал, может кому то пригодится. 

faces-config в итоге у меня пустой.

В applicationContext (контекст спринга), описываю все spring bean, dataSource (Sessionfactory), transactionManager и настройки хибера.

В web.xml прописываю путь к applicationContext, и вешая два листенера:
Код

<listener>
                <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>


помимо этого еще нужно повесить RequestLoaderListener (пишу по памяти, но вроде похоже ...), этот листенер нужен для работы с jsf.

Ну и в applicationContext, я не прописываю jsf manadeg beans, я просто из управлямых бинов (managed bean), достаю бины спринга и с ними работаю )

PM MAIL   Вверх
MisterCleric
Дата 15.4.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет.
Вообще по своему опыту могу сказать такое:
JSF-бины, в принципе, и не нужны.
Достаточно все описать в Spring и использовать их напрямую.
Для это в faces-config.xml добавить такое:
Код

 <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
 </application>




--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
4epT
Дата 15.4.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



Использовать их напрямую откуда ? Я например хочу использовать jsf контролы наподобие рич или прайм фейсес ...
PM MAIL   Вверх
MisterCleric
Дата 15.4.2011, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



JSF-контролы - это не Managed-бины. Это визуальные компоненты. Такие себе HTML-темплейты с некоторым JavaScript кодом.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
4epT
Дата 15.4.2011, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



то есть в атрибут action можно повесить метод/поле spring bean ? Если да, то чем такая связка лучше чем через managed bean ? =)
PM MAIL   Вверх
MisterCleric
Дата 18.4.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Цитата

то есть в атрибут action можно повесить метод/поле spring bean ? Если да, то чем такая связка лучше чем через managed bean ? =) 

Тем, что  у тебя всего лишь одно место конфигурации бинов. И только один контейнер - Spring.
А еще у тебя все получается в одном стиле - спринговском.
Spring со всеми своими фреймворками более мощней, чем JSF сам по себе. И вполне возможно, что решая задачи на JSF ты однажды придешь, к тому, что у Spring уже есть готовое решение. 
Ты его подключаешь к своему проекту - и начинает разрастаться у тебя конфигурация как JSF, так и Spring.
Как по мне так лучше все в одном месте иметь. Но это сугубо мое личное мнение. Просто однажды начав проект JSF+Spring я всю конфигурацию вынес в Spring и был доволен.



--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
4epT
Дата 18.4.2011, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



Цитата(MisterCleric @ 18.4.2011,  11:15)
Тем, что  у тебя всего лишь одно место конфигурации бинов. И только один контейнер - Spring.
А еще у тебя все получается в одном стиле - спринговском.
Spring со всеми своими фреймворками более мощней, чем JSF сам по себе. И вполне возможно, что решая задачи на JSF ты однажды придешь, к тому, что у Spring уже есть готовое решение. 
Ты его подключаешь к своему проекту - и начинает разрастаться у тебя конфигурация как JSF, так и Spring.
Как по мне так лучше все в одном месте иметь. Но это сугубо мое личное мнение. Просто однажды начав проект JSF+Spring я всю конфигурацию вынес в Spring и был доволен.

А тогда такой вопрос =)

Если я отказываюсь от JSF, то логично использовать Controller из Spring MVC ... да ? а как будет обстоять дело с шаблонами ? К примеру в JSF это facelets.
PM MAIL   Вверх
MisterCleric
Дата 19.4.2011, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет. Нет от JSF ты не отказываешь. Ты просто делаешь конфигурацию backend для JSF в Spring. JSF у тебя остается - он просто делает делегирование в Spring.
MVC тебе здесь не нужно: у тебя же есть FacesServlet, который и решает, какой backingBean вызываеть, а тот уже в свою очередь является SpringBean.
Для них обоих их взаимодействие остается прозрачным.
1. В web.xml ты прописываешь как конфигурацию JSF, так и конфигурацию Spring. Главное не забыть это:
Код

  <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>

Чтобы можно было пользоваться request & session Scope при конфигурации Spring/
2. В faces-config.xml добавляешь такое:
Код

  <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
  </application>

Все остальное - navigation-rules, converters, validators может остаться без изменения, хотя я тоже последние конфигурю в Spring
3. И того: у тебя получается приложение на JSF, просто его бины сконфигурены в другом контейнере. 


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
isabsent
Дата 1.5.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Цитата(MisterCleric @ 15.4.2011,  14:59)
Привет.
Вообще по своему опыту могу сказать такое:
JSF-бины, в принципе, и не нужны.
Достаточно все описать в Spring и использовать их напрямую.
Для это в faces-config.xml добавить такое:
Код

 <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
 </application>

Пробую реализовать вашу программу на основе референсного примера из пакета Spring Web Flow 2.3 swf-booking-faces В нем разбирается Spring-centric интеграция Spring, Hibernate с JSF2.0.  Столкнулся с необходимостью написания своего собственного конвертера WalletConverter.java, преобразующего строку списка referenceData.wallets в объект Wallet, чтобы вставить его в поле referenceData.wallets при обработке .xhtml страницы с элементом выбора из выпадающего списка:
Код

<h:selectOneMenu id="Wallet" value="#{newOutcome.wallet}">
     <f:selectItems value="#{referenceData.wallets}" />
     <f:converter converterId="walletConverter" />
</h:selectOneMenu>

В референсном примере такой конвертации нет - только "строки <-> числа", поэтому и проблемы такой нет.
На сколько я понял и мануалов, я должен добавить объявление конвертора в faces-config.xml
Код

<?xml version='1.0' encoding='UTF-8'?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
        version="2.0">

    <application>
        <message-bundle>JsfMessageResources</message-bundle>
    </application>
    
    <converter>
        <converter-id>walletConverter</converter-id>
        <converter-class>org.springframework.webflow.samples.booking.WalletConverter</converter-class>
    </converter>
</faces-config>

В WalletConverter.java мне необходим доступ к объекту walletService из контекста Spring
Код

package org.springframework.webflow.samples.booking;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class WalletConverter implements Converter  {

    @Autowired
    private WalletService walletService;

    public Wallet getAsObject(FacesContext context, UIComponent component, String name) {
        return walletService.getWalletByName(name);
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        Wallet wallet = (Wallet) value;
        return wallet.getName();
    }
}

Проблема в том, что Spring почему-то никак не хочет инжектировать walletService в предназначенное ему аннотацией @Autowired место. Под дебагом я вижу, что перед моментом конвертации вместо walletService стоит ссылка на null. Получать этот бин напрямую из контекста Spring мне не хочется по некоторым причинам. Поэтому возникает вопрос - Как инжектировать бин в JSF-конвертор? Чем тут может помочь добавление 
Код

 <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
 </application>

 в faces-config.xml ?
Поясните плз, почему в web.xml вы говорите, что нужно использовать 
Код

  <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
 а не 
Код

    <listener>
        <listener-class>
                    org.springframework.web.context.ContextLoaderListener
                </listener-class>
    </listener>
 как в примере?
Если возможно - выложите plz, исходники вашего приложения или хотя бы конфигурационные файлы web.xml, web-mvc.xml, web-flow.xml и faces-config.xml

Это сообщение отредактировал(а) isabsent - 1.5.2011, 12:08
PM MAIL   Вверх
RageSteel
  Дата 1.5.2011, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: 1
Всего: 2



Тебе не нужен JSF-конвертор для твоего случая.
В JSF2 можно просто написать:
Код

<f:selectItems value="#{referenceData.wallets}"
var="_wallet" itemValue="#{_wallet}" itemLabel="#{_wallet.name}" />


Что-же касается конверторов, то их тожно определять с помощью аннотаций.
А что касается того, как получить экземпляр сервиса в конверторе. Самое простое — это получить спринговый контекст и запросить у него.
Либо нужно как-то встраиваться в процесс создания конверторов в JSF2.
PM MAIL   Вверх
isabsent
Дата 1.5.2011, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Цитата(RageSteel @ 1.5.2011,  12:06)
Тебе не нужен JSF-конвертор для твоего случая.
В JSF2 можно просто написать:
Код

<f:selectItems value="#{referenceData.wallets}"
var="_wallet" itemValue="#{_wallet}" itemLabel="#{_wallet.name}" />



Спасибо, попробую осмыслить сейчас. Дадите ссылочку на то где это написано? Два дня гуглил - не попадалось ничего похожего...

P.S. Проверил вашу подсказку - Exception такой же как и был до того как я понял, что нужно писать конвертер
Код

DEBUG: org.springframework.binding.message.DefaultMessageContext - 
     Resolving message using [FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@cce2e7 
          severity = ERROR, text = 'Conversion Error setting value 'Wallet(Cash)' for 'null Converter'. ']


Это сообщение отредактировал(а) isabsent - 1.5.2011, 12:31
PM MAIL   Вверх
RageSteel
Дата 1.5.2011, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: 1
Всего: 2



Цитата(isabsent @ 1.5.2011,  10:13)
Спасибо, попробую осмыслить сейчас. Дадите ссылочку на то где это написано? Два дня гуглил - не попадалось ничего похожего...

P.S. Проверил вашу подсказку - Exception такой же как и был до того как я понял, что нужно писать конвертер
Код

DEBUG: org.springframework.binding.message.DefaultMessageContext - 
     Resolving message using [FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@cce2e7 
          severity = ERROR, text = 'Conversion Error setting value 'Wallet(Cash)' for 'null Converter'. ']

Документация по f:selectItems

Может у тебя твой конвертор мешается? Я активно пользуюсь этим синтаксисом и у меня с ним проблем не было. У тебя точно JSF 2.0?
PM MAIL   Вверх
isabsent
Дата 1.5.2011, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Судя по jsf-api-2.0.3.jar и jsf-impl-2.0.3.jar в Libraries проекта - надеюсь что JSF2.0... Или еще надо какие-то либы смотреть? Я делаю это под Tomcat 6 - в нем не может быть проблемы? 
Может есть какая-то демо-версия или хотя бы основные конфиги - сравнить? Видимо я что-то не так делаю. По прежнему пытается найти конверторы - 'null Converter' в Exception...

P.S. Никак не пойму как указание параметров itemValue и itemLabel на .xhtml-странице поможет мне вытащить нужный объект wallet из ArrayList<SelectItem> и поместить его поместить в поле newOutcome.wallet. 
Код

    public List<SelectItem> getWallets() {
        List<Wallet> allWallets;

    if (wallets == null) {
        wallets = new ArrayList<SelectItem>();
        allWallets = walletService.findAllWallets();
        for (Wallet w:allWallets) wallets.add(new SelectItem(w, w.getName()));
    }
    return wallets;
    }

Может у вас там что-то типа Using a Backing Map организовано и поэтому всё работает?

Это сообщение отредактировал(а) isabsent - 1.5.2011, 15:36
PM MAIL   Вверх
RageSteel
Дата 1.5.2011, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: 1
Всего: 2



Для использования itemLabel и itemValue метод getWallets должен возвращать не список SelectItem'ов, а просто список объектов Wallet, без преобразования.
PM MAIL   Вверх
isabsent
Дата 1.5.2011, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Точно! Невнимательно прочёл jsf-доку...
Переписал
Код

    public List<Wallet> getWallets() {
    return walletService.findAllWallets();


Код

                    <h:selectOneMenu id="Wallet" value="#{newOutcome.wallet}">
                        <f:selectItems value="#{referenceData.wallets}" var="w" itemValue="#{w}" itemLabel="#{w.name}" />
                    </h:selectOneMenu>

И всё равно - 
Код

DEBUG: org.springframework.binding.message.DefaultMessageContext - Resolving message using 
     [FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@60eb0c severity = ERROR, text =
          'Conversion Error setting value 'Wallet(Cash)' for 'null Converter'


Это сообщение отредактировал(а) isabsent - 1.5.2011, 17:55
PM MAIL   Вверх
RageSteel
Дата 1.5.2011, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: 1
Всего: 2



То что оно пишет в консоль Debug, может это от того, что у тебя на странице нет <h:messages />?
Конверторов больше никаких нет, ни в faces-config ни в классах с аннотациями?
Тип newOutcome.wallet точно принимает значение типа Wallet?
Почему в логах пишет Wallet(Cash), откуда берётся Cash?
В какой момент возникает сообщение? При отображении страницы или при осуществлении действия?
PM MAIL   Вверх
isabsent
Дата 1.5.2011, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Цитата(RageSteel @ 1.5.2011,  18:42)
То что оно пишет в консоль Debug, может это от того, что у тебя на странице нет <h:messages />?
Конверторов больше никаких нет, ни в faces-config ни в классах с аннотациями?
Тип newOutcome.wallet точно принимает значение типа Wallet?
Почему в логах пишет Wallet(Cash), откуда берётся Cash?
В какой момент возникает сообщение? При отображении страницы или при осуществлении действия?

У меня нет странице <h:messages />. А для чего оно там нужно? 
В логах пишет Wallet(Cash) потому что берет мой переопределенный wallet.toString() и выводит его в консоль. 
Код

    @Override
    public String toString() {
    return "Wallet(" + name + ")";
    }

Его же выводит и в выпадающих списках на веб-странице. Cash - это ID одного из Wallet - того, которого я выбрал из выпадающего списка перед тем как нажать на кнопку чтобы сохранить объект newOutcome в базу. 
Все упоминания о конверторах выкинул ОТОВСЮДУ и сами классы конверторов удалил из проекта.
В main-flow.xml
Код

        <var name="newOutcome" class="org.springframework.webflow.samples.booking.Outcome"/>

Код

public class Outcome implements Serializable {

    private static final long serialVersionUID = 1171567558348174963L;

    private Long id;

    private Wallet wallet;
...

Сообщение возникает при выполнении действия. До этого всё отрабатывается без ошибок.
Код

<p:commandButton id="saveOutcome" value="Save" action="saveOutcome" update=":outcomes" />

Полный лог того что происходит после нажатия на кнопку:
Код

DEBUG: org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'Spring MVC Dispatcher Servlet' processing POST request for [/booking/spring/main]
DEBUG: org.springframework.webflow.mvc.servlet.FlowHandlerMapping - Mapping request with URI '/booking/spring/main' to flow with id 'main'
DEBUG: org.springframework.webflow.executor.FlowExecutorImpl - Resuming flow execution with key 'e1s2
DEBUG: org.springframework.webflow.conversation.impl.SessionBindingConversationManager - Locking conversation 1
DEBUG: org.springframework.webflow.execution.repository.impl.DefaultFlowExecutionRepository - Getting flow execution with key 'e1s2'
DEBUG: org.springframework.webflow.definition.registry.FlowDefinitionRegistryImpl - Getting FlowDefinition with id 'main'
DEBUG: org.springframework.webflow.execution.factory.ConditionalFlowExecutionListenerLoader - Loaded [2] of possible 2 listeners for this execution request for flow 'main', the listeners to attach are list[org.springframework.faces.webflow.FlowFacesContextLifecycleListener@16a068, org.springframework.webflow.security.SecurityFlowExecutionListener@d17650]
DEBUG: org.springframework.webflow.engine.impl.FlowExecutionImpl - Resuming in org.springframework.webflow.mvc.servlet.MvcExternalContext@f1e762
DEBUG: org.springframework.webflow.engine.Flow - Restoring [FlowVariable@e136c3 name = 'searchCriteria', valueFactory = [BeanFactoryVariableValueFactory@1d241c9 type = SearchCriteria]]
DEBUG: org.springframework.webflow.engine.Flow - Restoring [FlowVariable@60904e name = 'newOutcome', valueFactory = [BeanFactoryVariableValueFactory@1a212ed type = Outcome]]
DEBUG: org.springframework.faces.support.RequestLoggingPhaseListener - Entering JSF Phase: RESTORE_VIEW 1
DEBUG: org.springframework.faces.webflow.JsfViewFactory - UIViewRoot restored for 'reviewOutcomes.xhtml'
DEBUG: org.springframework.faces.webflow.FlowLifecycle - Executing view post back lifecycle
DEBUG: org.springframework.faces.support.RequestLoggingPhaseListener - Entering JSF Phase: APPLY_REQUEST_VALUES 2
DEBUG: org.springframework.faces.webflow.FlowLifecycle - Processing decodes
DEBUG: org.springframework.faces.support.RequestLoggingPhaseListener - Entering JSF Phase: PROCESS_VALIDATIONS 3
DEBUG: org.springframework.faces.webflow.FlowLifecycle - Processing validators
DEBUG: org.springframework.binding.message.DefaultMessageContext - Resolving message using [FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@1d8337b severity = ERROR, text = 'Conversion Error setting value 'Wallet(Cash)' for 'null Converter'. ']
DEBUG: org.springframework.binding.message.DefaultMessageContext - Adding resolved message [FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@1d8337b severity = ERROR, text = 'Conversion Error setting value 'Wallet(Cash)' for 'null Converter'. ']
DEBUG: org.springframework.binding.message.DefaultMessageContext - Resolving message using [FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@11bfb3e severity = ERROR, text = 'Conversion Error setting value 'Wallet(Cash)' for 'null Converter'. ']
DEBUG: org.springframework.binding.message.DefaultMessageContext - Adding resolved message [FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@11bfb3e severity = ERROR, text = 'Conversion Error setting value 'Wallet(Cash)' for 'null Converter'. ']
DEBUG: org.springframework.binding.message.DefaultMessageContext - Resolving message using [FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@baf4c severity = ERROR, text = 'Conversion Error setting value 'Purchase(Car)' for 'null Converter'. ']
DEBUG: org.springframework.binding.message.DefaultMessageContext - Adding resolved message [FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@baf4c severity = ERROR, text = 'Conversion Error setting value 'Purchase(Car)' for 'null Converter'. ']
DEBUG: org.springframework.binding.message.DefaultMessageContext - Resolving message using [FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@121be32 severity = ERROR, text = 'Conversion Error setting value 'Purchase(Car)' for 'null Converter'. ']
DEBUG: org.springframework.binding.message.DefaultMessageContext - Adding resolved message [FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@121be32 severity = ERROR, text = 'Conversion Error setting value 'Purchase(Car)' for 'null Converter'. ']
DEBUG: org.springframework.webflow.engine.ViewState - Rendering + [JSFView = '/WEB-INF/flows/main/reviewOutcomes.xhtml']
DEBUG: org.springframework.webflow.engine.ViewState -   Flash scope = map['flowRenderResponse' -> true]
DEBUG: org.springframework.webflow.engine.ViewState -   Messages = [DefaultMessageContext@1f23d57 sourceMessages = map[[null] -> list[[empty]], 'j_idt33:Wallet_summary' -> list[[FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@1d8337b severity = ERROR, text = 'Conversion Error setting value 'Wallet(Cash)' for 'null Converter'. ']], 'j_idt33:Wallet_detail' -> list[[FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@11bfb3e severity = ERROR, text = 'Conversion Error setting value 'Wallet(Cash)' for 'null Converter'. ']], 'j_idt33:Purchase_summary' -> list[[FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@baf4c severity = ERROR, text = 'Conversion Error setting value 'Purchase(Car)' for 'null Converter'. ']], 'j_idt33:Purchase_detail' -> list[[FlowFacesContextMessageDelegate.FlowFacesMessageAdapter@121be32 severity = ERROR, text = 'Conversion Error setting value 'Purchase(Car)' for 'null Converter'. ']]]]
DEBUG: org.springframework.faces.webflow.JsfView - Asking faces lifecycle to render
DEBUG: org.springframework.faces.support.RequestLoggingPhaseListener - Entering JSF Phase: RENDER_RESPONSE 6
DEBUG: org.springframework.faces.webflow.FlowViewStateManager - Saving view root '/WEB-INF/flows/main/reviewOutcomes.xhtml' in view scope
DEBUG: org.springframework.faces.webflow.FlowViewStateManager - Saving view root '/WEB-INF/flows/main/reviewOutcomes.xhtml' in view scope
DEBUG: org.springframework.faces.webflow.JsfView - View rendering complete
DEBUG: org.springframework.webflow.execution.repository.impl.DefaultFlowExecutionRepository - Putting flow execution '[FlowExecutionImpl@9d966d flow = 'main', flowSessions = list[[FlowSessionImpl@1feea1e flow = 'main', state = 'reviewOutcomes', scope = map['searchCriteria' -> [Search Criteria searchString = '', 'newOutcome' -> Outcome(null,null), 'viewScope' -> map['outcomes' -> org.springframework.webflow.samples.booking.OutcomeLazyDataModel@bc6a08, 'flowSerializedViewState' -> [FlowSerializedView@1d54e44 viewId = '/WEB-INF/flows/main/reviewOutcomes.xhtml']]]]]]' into repository
DEBUG: org.springframework.webflow.execution.repository.impl.DefaultFlowExecutionRepository - Adding snapshot to group with id 2
DEBUG: org.springframework.webflow.conversation.impl.SessionBindingConversationManager - Putting conversation attribute 'scope' with value map['flashScope' -> map['messagesMemento' -> map[[empty]]]]
DEBUG: org.springframework.webflow.conversation.impl.SessionBindingConversationManager - Unlocking conversation 1
DEBUG: org.springframework.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'Spring MVC Dispatcher Servlet': assuming HandlerAdapter completed request handling
DEBUG: org.springframework.web.servlet.DispatcherServlet - Successfully completed request

А как должен быть аннотирован тот класс, в котором я делаю 
Код

    public List<Wallet> getWallets() {
    return walletService.findAllWallets();
    }

У меня просто @Service стоит. Может надо @Scope(request) какой-нибудь?

Это сообщение отредактировал(а) isabsent - 1.5.2011, 19:27
PM MAIL   Вверх
RageSteel
  Дата 1.5.2011, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: 1
Всего: 2



Ух. А можешь проект куда-нибудь выложить? А то у меня остаются только мысли вроде: «может что-то не так с развёртыванием и где-то остались старые файлы».

<h:messages /> нужно для отображения сообщения JSF'а. В частности туда бы у тебя вывелись сообщения о необходимости конвертации.

Что-же касается аннотаций @Service. Я знаю что там у Spring'а по умолчанию, но то что у тебя правильно выводит списки означает, что оно работает.
PM MAIL   Вверх
isabsent
Дата 1.5.2011, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Попробовал на Гугл выложить - что-то по ссылке архив не загружается... Сейчас подумаю - куда еще можно. Может проще на мыло выслать?

А! Вот - догадался и сюда выложил  smile 

Это сообщение отредактировал(а) isabsent - 1.5.2011, 20:48
PM MAIL   Вверх
RageSteel
  Дата 1.5.2011, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: 1
Всего: 2



PM MAIL   Вверх
isabsent
Дата 1.5.2011, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Перевыложил архив - замените плз. Там была версия с вариантом backing Map и кое-какие мелочи поправил.

На первой странице в левом верхнем углу нажать на login
На второй странице выбрать из предложенного списка login/password и нажать Login
На третьей ничего не вводить - только нажать Find Outcomes
На четвертой выбрать что-нибудь из выпадающих списков, в третье поле вставить 120.00, по четвертому щелкнуть и выбрать дату, в пятое вставить любой текст и нажать кнопку Save справа от строки ввода.

После этого в логе появятся DEBUG'и с error'ами на тему Conversion Error setting value 'Wallet(Cash)' for 'null Converter

Это сообщение отредактировал(а) isabsent - 1.5.2011, 21:13

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  booking.rar 228,30 Kb
PM MAIL   Вверх
isabsent
Дата 2.5.2011, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Сейчас выкину всё лишнее - две страницы, две таблицы, скрипт для их создания - и выложу. 
На первой странице - перейти по ссылке "Start your Spring Travel experience"
На второй странице выбрать что-нибудь из выпадающего списка, во второе поле вставить 120.00, по третьему щелкнуть и выбрать дату, в пятое вставить любой текст и нажать кнопку "Save".

Это сообщение отредактировал(а) isabsent - 2.5.2011, 10:23

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  WebKeeper.rar 195,90 Kb
PM MAIL   Вверх
isabsent
Дата 2.5.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Похоже, что вы имели ввиду вывод данных из бина в выпадающий список на странице. С этим у меня проблем не было с самого начала. А я спрашивал о конвертации в обратном направлении - из выпадающего списка на странице в поле объекта (а не просто в строку или число как в примере из SWF). 
PM MAIL   Вверх
RageSteel
  Дата 2.5.2011, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: 1
Всего: 2



Да, был не прав. Если просто вставить itemValue=#{w} то в html в значении option будет значение Wallet.toString(), что не верно.
Моё предложение, чтобы не связываться с конверторами: поместить в itemValue значение индентификатора Wallet. Тогда во время сохранения можно будет его восстановить.
Собственно я сделал ещё более «лёгкую» версию, только JSF2.0, безо всякого Spring'а. Недеюсь принцип понятен.

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  webkeeper_lite.zip 8,59 Kb
PM MAIL   Вверх
isabsent
Дата 2.5.2011, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Спасибо - разберу ваш пример. Для тех кто нас прочтёт  smile  - если хочется обойтись JSF только в качестве view, а весь IoC иметь от spring то, похоже, единственно правильный путь - делать как учил товарищ BalusC Using a Backing Map

Если кто-то знает как внедрить Spring-бины в JSF-конвертер - очень хотелось бы услышать. (Только не через вытаскивание посредством Spring-контекста).
PM MAIL   Вверх
RageSteel
  Дата 2.5.2011, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: 1
Всего: 2



Внедрить Spring-Bean'ы в JSF-конвертор — вот ещё один вариант.
Если посмотреть со стороны JSF — то правильный способ — Spring должен предоставлять реализацию JSF ApplicationFactory, которая в методе createConvertor возвращала бы экземпляр с внедрёнными зависимостями.
Но…, почему ты так хочешь воспользоваться именно конвертором?
PM MAIL   Вверх
isabsent
Дата 3.5.2011, 05:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Цитата(RageSteel @ 2.5.2011,  21:02)
Внедрить Spring-Bean'ы в JSF-конвертор — вот ещё один вариант.
Если посмотреть со стороны JSF — то правильный способ — Spring должен предоставлять реализацию JSF ApplicationFactory, которая в методе createConvertor возвращала бы экземпляр с внедрёнными зависимостями.
Но…, почему ты так хочешь воспользоваться именно конвертором?

Понять будет ли то что тут предложено работать и как Внедрить Spring-Bean'ы в JSF-конвертор мне пока не хватает опыта. Вот если бы там рабочий пример был... 

JSF ApplicationFactory - она уже есть в Spring или подразумевается, что я сам её напишу? 

Потому что конвертор - это стандартный подход в JSF. Не нужно реализовывать подпорки типа той, что описана у BalusC. И вроде всё для него есть - одна только проблема - заставить JSF увидеть бин walletService...
Код

package org.springframework.webflow.samples.booking;

@Component
public class WalletConverter implements Converter  {

    @Autowired
    private WalletService walletService;

    public Wallet getAsObject(FacesContext context, UIComponent component, String name) {
        return walletService.getWalletByName(name);
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        Wallet wallet = (Wallet) value;
        return wallet.getName();
    }
}


Это сообщение отредактировал(а) isabsent - 3.5.2011, 07:03
PM MAIL   Вверх
RageSteel
  Дата 3.5.2011, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: 1
Всего: 2



В Spring'е я такого не обнаружил, хотя он вполне там и мог бы быть. Самому писать лениво — Spring мне не особо интересен но общий принцип простой. Реализуем ApplicationFactory, где все методы кроме создания Application переправляем в оригинальную ApplicationFactory. В методе создания Application оборачиваем созданный Application с помощью ApplicationWrapper, где в свою очередь переопределяем метод возвращения конвертора. Вместо него пишем получаем Bean конвертора из Spring'а. Как-то так.

Может способ, приведённый на stackoverflow всех устраивает (@Component("myConverter")).
PM MAIL   Вверх
MisterCleric
Дата 4.5.2011, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Насчет конвертеров и валидаторов.
Зачем их определять в faces-config.xml, если у тебя есть Spring?
Просто берешь их и определяешь как Spring бины, разве что имплементишь нужные интерфейсы. И будет тебе счастье с @Autowired.
Разве что нужно быть аккуратным со scope, чтобы они не оказались у тебя на все приложение, да и чтобы не получился scope impedans.

И насчет RequestContextListener.

Такова рекомендация интеграции JSF+Spring. Он нужен для того, чтобы мокжно было работать со scopes session & request.
а также в его исходниках так и написано:
Цитата

This listener is mainly for use with third-party servlets, e.g. the JSF FacesServlet.




--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
isabsent
Дата 8.5.2011, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Цитата(MisterCleric @ 4.5.2011,  10:45)
Насчет конвертеров и валидаторов.
Зачем их определять в faces-config.xml, если у тебя есть Spring?
Просто берешь их и определяешь как Spring бины, разве что имплементишь нужные интерфейсы. И будет тебе счастье с @Autowired.

Золотые слова! Жаль, что сразу не доходят - только после того как на всех граблях постоишь... Не забывайте переопределять equals() и hashCode() у бина, для которого пишется свой пользовательский Converter - иначе долгий и упорный "Validation Error: Value is not valid" в элементах типа selectOneMenu...

Странно, почему конвертер в JSF так выделен среди других классов? Ведь можно же инжектировать Spring-бины в другие JSF-бины (вот, например, без проблем инжектятся), а как только класс implements Converter, так всё это благолепие рушится и остаётся один грубый FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance()).getBean("yourServiceBean")! Почему так?!

Это сообщение отредактировал(а) isabsent - 8.5.2011, 22:17
PM MAIL   Вверх
RageSteel
  Дата 9.5.2011, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: 1
Всего: 2



Цитата(isabsent @ 8.5.2011,  19:55)
Странно, почему конвертер в JSF так выделен среди других классов? Ведь можно же инжектировать Spring-бины в другие JSF-бины (вот, например, без проблем инжектятся), а как только класс implements Converter, так всё это благолепие рушится и остаётся один грубый FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance()).getBean("yourServiceBean")! Почему так?!

В приведённой ссылкы injectируется результат выполнения Expression Language выражение, а так как используется Spring EL Resolver, то там работает подключение Spring-Bean'ов. Жизненный цикл конвертора управляется JSF'ом, который ничего про Spring не знает.
PM MAIL   Вверх
isabsent
Дата 9.5.2011, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Цитата(RageSteel @ 9.5.2011,  06:11)
В приведённой ссылкы injectируется результат выполнения Expression Language выражение, а так как используется Spring EL Resolver, то там работает подключение Spring-Bean'ов. Жизненный цикл конвертора управляется JSF'ом, который ничего про Spring не знает.

В приведённой ссылке жизненный цикл бина BikeDetails, в который легко и непринуждённо инжектируется Spring-бин bikeDataProvider, находится под управлением JSF IoC. Однако в JSF Converter, точно так же находящийся под управлением JSF IoC, невозможно инжектировать ничего, что находится под управлением Spring IoC - даже с помощью EL-Resolver. Поэтому я не совсем понимаю ваш ответ - ведь ситуация одна и та же, а spring-бин не инжектируется во втором случае...
PM MAIL   Вверх
RageSteel
  Дата 9.5.2011, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: 1
Всего: 2



Не совсем так. В BikeDetails inject'ируется не Spring Bean, а результат выполнения ExpressionLanguage выражения! И Spring представляет реализацию ELResolver'а, который может получать доступ к Spring'овым Bean'ам.
PM MAIL   Вверх
isabsent
Дата 9.5.2011, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Цитата(RageSteel @ 9.5.2011,  10:22)
Не совсем так. В BikeDetails inject'ируется не Spring Bean, а результат выполнения ExpressionLanguage выражения! И Spring представляет реализацию ELResolver'а, который может получать доступ к Spring'овым Bean'ам.

Всё равно непонятно - почему тот же самый результат выполнения ExpressionLanguage выражения не может инжектироваться в Converter!? Чем Converter принципиально отличается от любого другого JSF-бина с точки зрения Spring'a или EL-Resolvera?

Это сообщение отредактировал(а) isabsent - 9.5.2011, 11:39
PM MAIL   Вверх
RageSteel
  Дата 9.5.2011, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: 1
Всего: 2



Конвертор не поддерживает @ManagedProperty, если я правильно помню.
PM MAIL   Вверх
isabsent
Дата 9.5.2011, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



Цитата(RageSteel @ 9.5.2011,  12:13)
Конвертор не поддерживает @ManagedProperty, если я правильно помню.

Да - я в этом на собственной шкуре убедился  smile Осталось понять за что его так обидели те, кто всё это smile придумали и почему они не написали этого в API  smile . Кстати - если он не поддерживает @ManagedProperty, то значит я и находясь только под JSF IoC (без Spring'a вообще) не смогу попользоваться инжекцией какого-нибудь JSF ManagedBean. То есть буду вынужден какими-то статическими методами вызывать свои сервисы или опять же тащить их через Context. В чём смысл таких жёстких ограничений?

Это сообщение отредактировал(а) isabsent - 9.5.2011, 15:35
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1742 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.