JSF View scope весной

Есть ли в Spring 3.0 область видимости, подобная JSF @ViewScoped? У меня есть приложение, использующее JSF + Spring, где вспомогательные bean-компоненты управляются Spring. Я не нашел в Spring такой области видимости, как область видимости JSF. Я видел блог Портировал ViewScope из JSF 2.0 на Spring 3.0, но у меня это не сработало.

Вот моя попытка использовать настраиваемую область действия Spring:

import java.util.Map;

import javax.faces.context.FacesContext;

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.Scope;

/**
 * Implements the JSF View Scope for use by Spring. This class is registered as a Spring bean with the CustomScopeConfigurer.
*/
public class ViewScope implements Scope {

    public Object get(String name, ObjectFactory<?> objectFactory) {

        System.out.println("**************************************************");
        System.out.println("-------------------- Getting objects For View Scope ----------");
        System.out.println("**************************************************");
        if (FacesContext.getCurrentInstance().getViewRoot() != null) {
            Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();
            if (viewMap.containsKey(name)) {
                return viewMap.get(name);
            } else {
                Object object = objectFactory.getObject();
                viewMap.put(name, object);
                return object;
            }
        } else {
            return null;
        }
    }

    public Object remove(String name) {
        System.out.println("**************************************************");
        System.out.println("-------------------- View Scope object Removed ----------");
        System.out.println("**************************************************");

        if (FacesContext.getCurrentInstance().getViewRoot() != null) {
            return FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(name);
        } else {
            return null;
        }
    }

    public void registerDestructionCallback(String name, Runnable callback) {
        // Do nothing
    }

    public Object resolveContextualObject(String key) {         return null;
    }

    public String getConversationId() {
        return null;
    }

}

application-context.xml:

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
            <map>
                <entry key="view">
                    <bean class="com.delta.beans.ViewScope"/>
                </entry>
            </map>
        </property>
 </bean>

person khan    schedule 22.10.2012    source источник
comment
Этот мой пост может помочь: stackoverflow.com/q/12884822/1055089   -  person Vrushank    schedule 22.10.2012
comment
Да, но реализация в моем коде не работает   -  person khan    schedule 22.10.2012
comment
не могли бы вы опубликовать код ?? Я использовал то же самое в своем приложении, и это сработало. Я тоже использую JSF2 + Spring 3 ...   -  person Vrushank    schedule 22.10.2012
comment
да, я использую тот же JSF2 + Spring 3 ... я вставил ..   -  person khan    schedule 22.10.2012
comment
Можете ли вы пояснить, что не работает? Просто чтобы убедиться, что ваш код работает с @Scope (запрос)?   -  person Ravi Kadaboina    schedule 22.10.2012
comment
Как я уже говорил ранее, @Scope (request) создает проблему в моем сценарии, так как при отправке запроса для второго раскрывающегося списка предыдущее значение, которое используется вторым выпадающим списком, упало.   -  person khan    schedule 23.10.2012
comment
См. Эту ссылку: Просмотр области действия Spring работал для меня...   -  person Ednilson Campos    schedule 07.03.2013


Ответы (3)


Недавно я создал артефакт maven, который решит эту проблему.

См. Мой репозиторий github javaplugs / spring-jsf.

person rumatoest    schedule 20.04.2015

Я сделал что-то подобное без переноса bean на Spring. У меня это работает.

@ManagedBean(name="bean")
@ViewScoped  // actual jsf viewscoped only with javax.faces.viewscoped import
public class Bean implements
Serializable {


@ManagedProperty(value="#{appService}")   // Spring Manged Bean and singleton
private transient AppService appService;

  // Getting AppService Object which is singleton in the application during deserialization 
 private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
          stream.defaultReadObject();
          FacesContext context = FacesContext.getCurrentInstance();
          appService = (AppService)context.getApplication()
                .evaluateExpressionGet(context, "#{appService}", AppService.class);
       }
}
person SRy    schedule 15.02.2013
comment
Это чистое решение JSF. Он работает нормально, но в нем отсутствуют функции Spring. Например, это не позволяет аспектно-ориентированное программирование. - person Stephan Rauh; 29.04.2014
comment
Я не очень уверен насчет Spring AOP. Потому что я тестировал это в соответствии с моими требованиями в то время. Но у меня был Spring core, который у меня отлично работал. - person SRy; 29.04.2014
comment
Ах я вижу. Скорее всего, вы преобразовали свое решение JSF в решение Spring, добавив SpringBeanFacesELResolver в faces.config. Если это так, АОП должен работать нормально. - person Stephan Rauh; 30.04.2014
comment
Тем не менее, это не полноценный компонент Spring с ограниченным обзором. Вы сами это прокомментировали: класс Bean имеет область видимости, но компонент Spring, который он использует, принадлежит другой области. Согласно комментарию, это синглтон, и вы назвали его службой, поэтому, вероятно, он не имеет состояния. Большинство разработчиков довольны вашим решением. Но это не то же самое: bean-компонент Spring не должен хранить состояние, специфичное для представления. - person Stephan Rauh; 30.04.2014
comment
Я не уверен, где хранится состояние, связанное с просмотром. Я просто получаю компонент Spring, который обнуляется во время сериализации, потому что он помечен как временный, потому что @viewscope хочет, чтобы все зависимые компоненты были Serialized. И еще Singletons не являются лицами без гражданства. - person SRy; 30.04.2014
comment
Если singletons равны stateless Какова цель реализации bean-компонента как singleton, когда он каждый раз возвращает новый экземпляр. - person SRy; 30.04.2014
comment
Истинный. Я имел в виду состояние просмотра. Синглтоны могут содержать одно глобальное состояние. Области представления не могут хранить свое состояние в синглтоне. - person Stephan Rauh; 30.04.2014
comment
Если вы не хотите, чтобы синглтон сохранял ваше состояние, вы можете указать prototype = true при создании компонента Spring. - person SRy; 30.04.2014

Я попытался обойти проблему утечки памяти Jsf view bean для Jsf 2.1 и Jsf 2.2. Попробуйте использовать код по следующей ссылке Утечка памяти с помощью компонента ViewScoped?. Это очистит компонент представления в сеансе при переходе на следующую страницу.

person Sathish Kumar    schedule 04.02.2014
comment
То, о чем вы говорите, не относится к JSF. И это совершенно не связано с этим вопросом, кстати. - person Xtreme Biker; 14.07.2014