Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Tipos de Scopes

No FramaWork JSF, temos um Scope chamado de ViewScope, esse Ecope, mantem os objetos até que a View seja fechada. Nessa aula, foi abordado o Request e Session Scope, como ficaria o no spring o ViewScope?

1 resposta
solução!

O spring não possui view scope, por isso voce tera que criar o seu proprio @scope("view").

1) O spring te da suporte para criacao de um novo escopo

public class ViewScope implements org.springframework.beans.factory.config.Scope {

  public Object get(String name, ObjectFactory<?> objectFactory) {
    if (FacesContext.getCurrentInstance().getViewRoot() != null) {
      Map<String, Object> viewMap = FacesContext.getCurrentInstance()
             .getViewRoot()
             .getViewMap(); // Map do JSF cujo os valores são referentes ao escopo de view
      if (viewMap.containsKey(name)) {
        return viewMap.get(name);
      } else {
        Object object = objectFactory.getObject();
        // da próxima vez que for requisitado, dentro do escopo de view,
        // ele não precisará ser construído.
        viewMap.put(name, object);
        return object;
      }
    } else {
      return null;
    }
  }

  public Object remove(String name) {
    if (FacesContext.getCurrentInstance().getViewRoot() != null) {
      // simplesmente, remove o bean Spring do ViewMap do JSF
      return FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(name);
    } else {
      return null;
    }
  }

  ...
}

2) Agora vc precisa invocar o metodo register scope

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

  void registerScope(String scopeName, Scope scope);

  ...
}

@Configuration
public class ViewScopeConfig {

    @Bean
    public static CustomScopeConfigurer customScopeConfigurer() {
        Map<String, Object> scopes = new HashMap<>();
        scopes.put("view", new ViewScope());

        CustomScopeConfigurer customScopeConfigurer = new CustomScopeConfigurer();
        customScopeConfigurer.setScopes(scopes);

        return customScopeConfigurer;
    }
}

3) Por ultimo, basta anotar seu Managed Bean com as seguinte annotations:

@Component
@Scope("view")