Scope("view") não está funcionando no Spring

4 respostas
D

Como o spring não possui a anotação de escopo "view" nativa eu procurei aquela implementação que tem na internet e coloquei no meu projeto.
Fiz as devidas configurações no .xml conforme é necessário, etc... Inclusive não estou tendo nenhum "erro" ao rodar meu sistema.

Porém eu percebi que a cada requisição ajax meu método anotado com @Postconstructor é chamado o que está causando lentidão, pois neste procedimento eu faço a carga inicial
das minhas Lists<>.

A duvida é:
- Deveria estar se comportando deste modo? A impressão que tenho é de que está funcionando como "request".

Minha Implementação

package br.com.webscola.util;
 import java.util.Map;
 import javax.faces.context.FacesContext;
 import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.Scope;
 public class ViewScope implements Scope {  

    public Object get(String name, ObjectFactory objectFactory) {
        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;
        }
    }
 
    public Object remove(String name) {
        return FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(name);
    }
 
    public String getConversationId() {
        return null;
    }
 
    public void registerDestructionCallback(String name, Runnable callback) {
        //Not supported
    }
 
    public Object resolveContextualObject(String key) {
        return null;
    }
}

Configuração do meu .xml

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

4 Respostas

altitdb

Pode postar seu código pra gente dar uma analisada??

D
altitdb:
Pode postar seu código pra gente dar uma analisada??

Não sei qual trecho você quer exatamente, mais a minha implementação do view scoped para spring já coloquei no post anterior...

Segue trecho do meu controller. Meu método anotado com @Postconstruct está sendo chamado a cada requisição ajax.

package br.com.webscola.controller;

import br.com.webscola.model.bean.CentroCusto;
import br.com.webscola.model.bean.Parcela;
import br.com.webscola.model.bean.Pessoa;
import br.com.webscola.model.bean.Titulo;
import br.com.webscola.service.CentroCustoService;
import br.com.webscola.service.FinanceiroService;
import br.com.webscola.service.PessoaService;
import br.com.webscola.util.Calculos;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.primefaces.component.datatable.DataTable;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.ChartSeries;
import org.primefaces.model.chart.PieChartModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("view")
public class TituloMB implements Serializable {

    @Autowired
    private FinanceiroService financeiroService;
    @Autowired
    private PessoaService pessoaService;
    @Autowired
    private CentroCustoService centroCustoService;
    private Titulo titulo = new Titulo();
    private List<Titulo> titulosPagar = new ArrayList<Titulo>();
    private List<Titulo> titulosReceber = new ArrayList<Titulo>();
    private List<Parcela> parcelasApagar = new ArrayList<Parcela>();
    private List<Pessoa> fornecedores = new ArrayList<Pessoa>();
    private List<Pessoa> clientes = new ArrayList<Pessoa>();
    private CentroCusto centroCusto = new CentroCusto();
    private List<CentroCusto> centrosCusto = new ArrayList<CentroCusto>();
    private List<CentroCusto> centrosReceita = new ArrayList<CentroCusto>();
    private Parcela parcela;
    private Integer intervaloParcelas = 0;
    private Boolean gerarParcelas = false;
    public static final String INDEX = "index";
    public static final String CPAGAR_INDEX = "cpagar_index";
    public static final String CPAGAR_INS = "cpagar_ins";
    public static final String CPAGAR_ALT = "cpagar_alt";
    public static final String BAIXACPAGAR = "baixa_cpagar";
    public static final String CRECEBER_INDEX = "creceber_index";
    public static final String CRECEBER_INS = "creceber_ins";
    public static final String CRECEBER_ALT = "creceber_alt";
    public static final String BAIXACRECEBER = "baixa_creceber";
    public static final String CHEQUE_INDEX = "cheque_index";
    public static final String CHEQUE_INS = "cheque_ins";
    public static final String CHEQUE_ALT = "cheque_ALT";
    public static final String MOV_INDEX = "mov_index";
    public static final String MOV_INS = "mov_ins";
    public static final String MOV_ALT = "mov_alt";
    public static final String BPERIODO_INDEX = "bperiodo_index";
    public static final String BPERIODO_INS = "bperiodo_ins";
    public static final String BPERIODO_ALT = "bperiodo_alt";
    public static final String FLUXO_INDEX = "fluxo_index";
    private String currentState = INDEX;
    private DataTable dataTable;
    private CartesianChartModel categoryModel;
    private PieChartModel pieModel;

    public TituloMB() {
    }

    @PostConstruct
    public void carregar() {
        System.out.println("EXECUTOU METODO CARREGAR");
        createCategoryModel();
        createPieModel();

        //Carregar centros de custo
        atualizarCentrosCusto();

        //Carrega lista de fornecedores
        atualizarListaFornecedores();

        //Carrega centros de receita
        atualizarCentrosReceita();

        //Carrega lista de clientes
        atualizarListaClientes();
        
        atualizarTitulosPagar();
        
        atualizarTitulosReceber();
    }
.
.
.
.
.
D

O mais estranho é que isto só acontece em um dos meus controllers. E nele não há nada de diferente em relação aos outros.

D

O mais estranho é que isto só acontece em um dos meus controllers. E nele não há nada de diferente em relação aos outros.

Criado 17 de janeiro de 2012
Ultima resposta 28 de jan. de 2012
Respostas 4
Participantes 2