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?
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?
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")