Perda de referência de objeto em JSF

0 respostas
A

Boa tarde amigos, estou desenvolvendo um projeto no netbeans com spring, JPA, JSF (Richfaces) e por algum motivo as vezes meu managerbeans perde referência com um object passado para o mesmo durante a sua inicializaçào (no <h:selectOneMenu).
o codigo está abaixo da página.

<?xml version='1.0' encoding='ISO-8859-1' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
        <title>Controle de Fichas de Apuração Disciplinar</title>
        <link href="css/default.css" rel="stylesheet" type="text/css" />
        <link href="css/estilos.css" rel="stylesheet" type="text/css" />

    </head>
    <body>
        <div id="fundo">
            <img name="topo" id="topo" src="imagens/afacabecalho.gif" alt="imagem afa"/>
            <h:form>
                <div id="cabecalho" class="bordapadrao">
                    <h:panelGrid columns="6" styleClass="ffatd">
                        <label jsfc="h:outputLabel" for="numerobusca">Nº FATD:</label>
                        <h:inputText id="numerobusca" value="#{ffatd.fatd.id}" converterMessage= "Número Fatd: o valor deve ser um inteiro entre 0 e 990000."
                           validatorMessage="Número Fatd: o valor deve ser um inteiro entre 0 e 990000.">
                           <f:validateLongRange minimum="0" maximum="990000" /> 
                        </h:inputText>
                        <label jsfc="h:outputLabel" for="esquadrao">Esquadrões:</label>
                        <h:selectOneMenu id="esquadrao"  value="#{ffatd.fatd.turma}" converterMessage="Esquadrões: Não estou conseguindo">
                            <f:selectItems  value="#{ffatd.esquadroes}" />
                        </h:selectOneMenu>
                        <label jsfc="h:outputLabel" for="situacao">Situação:</label>
                        <h:selectOneMenu id="situacao"  value="#{ffatd.fatd.situacao}" converterMessage="Situação: Não estou conseguindo">
                            <f:selectItems  value="#{ffatd.situacao}" />
                        </h:selectOneMenu>
                    </h:panelGrid>
                    <hr/>
                    <h:panelGrid columns="4">
                        <label jsfc="h:outputLabel" class="ffatd">Filtros Avançados:</label>
                        <h:commandButton value="Buscar"  type="submit" styleClass="ffatd" action="#{ffatd.buscar}"/>
                        <h:commandButton value="voltar"  styleClass="ffatd" action="voltar" immediate="true"/>
                        <h:commandButton value="nova fatd" styleClass="ffatd" action="#{ffatd.nova}" />
                        <label jsfc="h:outputLabel" for="nomebusca">Trecho do n. guerra ou número:</label>
                        <input jsfc="h:inputText" type="text" name="nomebusca" id="nomebusca" value="#{ffatd.busca}"/>
                        <label jsfc="h:outputLabel" for="tipopunicao">Por tipo de punição:</label>
                        <h:selectOneMenu id="tipopunicao"  value="#{ffatd.tipo}" converterMessage="Tipo punição: Não estou conseguindo">
                            <f:selectItems  value="#{ffatd.tipoPunicoes}" />
                        </h:selectOneMenu>
                        <label jsfc="h:outputLabel" for="iniciobusca">Período de início:</label>
                        <h:inputText id="iniciobusca" value="#{ffatd.pesqInicio}" converterMessage= "Data início: o valor deve ser uma data no formato 01/01/2009"
                           validatorMessage="Data início: o valor deve ser uma data no formato 01/01/2009">
                           <f:convertDateTime timeZone="America/Sao_Paulo"/>
                        </h:inputText>
                        <label jsfc="h:outputLabel" for="terminobusca" class="ffatd2">término:</label>
                        <h:inputText id="terminobusca" value="#{ffatd.pesqTermino}" converterMessage= "Data término: o valor deve ser uma data no formato 01/01/2009"
                           validatorMessage="Data término: o valor deve ser uma data no formato 01/01/2009">
                           <f:convertDateTime timeZone="America/Sao_Paulo"/>
                        </h:inputText>  
                    </h:panelGrid>
                    <hr/>
                    <h:messages showDetail="true"/>
                    <rich:dataTable value="#{ffatd.tabela}" var="f" style=" width:770px" id="tabela" rows ="20">
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="Nº FATD"/>
                            </f:facet>
                            <h:outputLink value="#{ffatd.cancelar}">
                                <h:outputText value="#{f.id}"/>
                            </h:outputLink>                            
                        </h:column>
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="Cadete"/>
                            </f:facet>
                            <h:outputText value="#{f.alunos}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="Status"/>
                            </f:facet>
                            <h:outputText value="#{f.status}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="Justificada"/>
                            </f:facet>
                            <h:outputText value="#{f.justificada}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="Tipo"/>
                            </f:facet>
                            <h:outputText value="#{f.tipoPunicao}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="Dias"/>
                            </f:facet>
                            <h:outputText value="#{f.diasccaer}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="A contar de"/>
                            </f:facet>
                            <h:outputText value="#{f.datainicio}">
                                <f:convertDateTime timeZone="America/Sao_Paulo"/>
                            </h:outputText>
                        </h:column>
                    </rich:dataTable>
                    <rich:datascroller for="tabela" maxPages="5" />
                </div>                
            </h:form>
        </div>
    </body>
</html>

meu manger Beans:

@Controller("ffatd")
@Scope("session")
public class Ffatd implements Serializable {

    private Fatd fatd;
    @Resource
    private FatdFacade fatdFacade;
    @Resource
    private TurmaFacade turmaFacade;
    private Map<String, Object> mapa;
    private Date pesqInicio;
    private Date pesqTermino;
    private DataModel model;
    private String busca;
    private int tipo;
    private Map<String, Object> esquadroes;
    private List<Fatd> consulta;
    private Long selecionada;

    public Ffatd() {
        fatd=new Fatd();
        fatd.setTurma(new Turma());
    }

    public DataModel getTodos() {
        return model = new ListDataModel(fatdFacade.ObterTodos());
    }

    public Fatd getFatdTabela() {
        Fatd f = (Fatd) model.getRowData();
        return f;
    }

    public String editarFatd() {
        setFatd(getFatdTabela());
        return "form fatd";
    }

    public String salvar() {
        //verifica se não é uma fatd em edição
        if (fatd.getId() == null) {
            fatdFacade.salvar(fatd);
        } else {
            fatdFacade.atualizar(fatd);
        }
        return "sucesso";
    }

    public String nova() {
        return "nova";
    }

    public Map<String, Object> getSituacao() {
        mapa = new LinkedHashMap<String, Object>();
        mapa.put("Todos", 0);
        mapa.put("Aguardando Parecer do Esquadrão", 1);
        mapa.put("Aguardando Parecer Autoridade FINAL", 2);
        mapa.put("Faltando apenas submeter à Aut. Final", 3);
        mapa.put("Apuradas(p/ Cmt)  e data de início futuro", 4);
        return mapa;
    }

    public Map<String, Object> getEsquadroes() {
        esquadroes = new LinkedHashMap<String, Object>();
        
        for (Turma t : turmaFacade.obterPorAnoAtual()) {
            esquadroes.put(t.getNome(), t);
        }
        esquadroes.put("Todos", 0);
        return esquadroes;
    }

    @SuppressWarnings("static-access")
    public Map<String, Object> getTipoPunicoes() {
        mapa = new LinkedHashMap<String, Object>();
        int n = 1;
        mapa.put("Todos", 0);
        for (String s : fatd.getListaPunicaos()) {
            mapa.put(s, n);
            n++;
        }
        return mapa;
    }

    public String buscar() {
        return null;
    }

    public String getCancelar() {
        return "ccaer.jsf";
    }

    public DataModel getTabela() {
        StringBuilder sb = new StringBuilder("SELECT f FROM Fatd f ");
        mapa = new HashMap<String, Object>();
        //para descobrir cmt corpo e esquadrao
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
        int perm = (Integer) session.getAttribute("permissao");
        boolean isCmtCorpo = ((perm & 16) != 0);
        boolean isCmtEsquadrao = ((perm & 32) != 0);
        boolean ja = false;        
        if (fatd.getId() != null && fatd.getId() > 0) {
            sb.append(" WHERE f.id = :num");
            mapa.put("num", fatd.getId());
            ja = true;
        }
        if (busca != null && !busca.equals("")) {
            if (ja) {
                sb.append(" AND ");
            } else {
                sb.append("WHERE ");
            }
            sb.append("(f.alunos.nguerra like :nome or f.alunos.numeroAfa like :numero) ");
            mapa.put("nome", "%" + busca + "%");
            mapa.put("numero", "%" + busca + "%");
            ja = true;
        }
        if (tipo > 0) {
            if (ja) {
                sb.append(" AND ");
            } else {
                sb.append("WHERE ");
            }
            sb.append(" f.tipocmtccaer = :tipo ");
            mapa.put("tipo", (tipo - 1));
            ja = true;
        }
        System.out.println("antes"+fatd.getTurma()==null);
        if (fatd.getTurma() != null && !fatd.getTurma().getNome().equals("")) {

            if (ja) {
                sb.append(" AND ");
            } else {
                sb.append("WHERE ");
            }
            sb.append(" f.turma= :tur");
            System.out.println("sel"+fatd.getTurma());
            

            mapa.put("tur", fatd.getTurma());

            ja = true;
        }
        if (fatd.getSituacao() != null) {
            int sit = Integer.parseInt(fatd.getSituacao());

            if (sit > 0) {
                if (ja) {
                    sb.append(" AND ");
                } else {
                    sb.append("WHERE ");
                }
            }
            if (sit == 1) {
                sb.append(" (f.tipo=0 AND f.tipocmtccaer=0)");
            } else if (sit == 2) {               
                if (isCmtCorpo && !isCmtEsquadrao) {
                    sb.append("(f.tipo > 3 AND f.tipocmtccaer=0 AND f.prontoccaer = 1)");
                } else {
                    sb.append("(f.tipo > 0 AND f.tipocmtccaer=0 AND f.prontoccaer = 1)");
                }
            } else if (sit == 3) {                
                sb.append("(f.tipo > 0 AND f.tipocmtccaer=0 AND f.prontoccaer=0)");
            } else if (sit == 4) {                
                sb.append(" (f.tipocmtccaer!=0 AND f.prontoccaer=1)");
            }
        }
        if (pesqInicio != null) {
            if (ja) {
                sb.append(" AND ");
            } else {
                sb.append(" WHERE ");
            }
            sb.append(" f.datainicio>= :dat ");
            mapa.put("dat", pesqInicio);
            ja = true;
        }
        if (pesqTermino != null) {
            if (ja) {
                sb.append(" AND ");
            } else {
                sb.append(" WHERE ");
            }
            sb.append(" f.datainicio<= :dato ");
            mapa.put("dato", pesqTermino);
            ja = true;
        }
        System.out.println(sb.toString());
        consulta = fatdFacade.obterPorWhere(sb.toString(), mapa);
        ja = false;        
        return model = new ListDataModel(consulta);
    }

    /**
     * @return the fatd
     */
    public Fatd getFatd() {
        return fatd;
    }

    /**
     * @param fatd the fatd to set
     */
    public void setFatd(Fatd fatd) {
        this.fatd = fatd;
    }

    /**
     * @return the fatdFacade
     */
    public FatdFacade getFatdFacade() {
        return fatdFacade;
    }

    /**
     * @param fatdFacade the fatdFacade to set
     */
    public void setFatdFacade(FatdFacade fatdFacade) {
        this.fatdFacade = fatdFacade;
    }

    /**
     * @return the pesqInicio
     */
    public Date getPesqInicio() {
        return pesqInicio;
    }

    /**
     * @param pesqInicio the pesqInicio to set
     */
    public void setPesqInicio(Date pesqInicio) {
        this.pesqInicio = pesqInicio;
    }

    /**
     * @return the pesqTermino
     */
    public Date getPesqTermino() {
        return pesqTermino;
    }

    /**
     * @param pesqTermino the pesqTermino to set
     */
    public void setPesqTermino(Date pesqTermino) {
        this.pesqTermino = pesqTermino;
    }

    /**
     * @return the model
     */
    public DataModel getModel() {
        return model;
    }

    /**
     * @param model the model to set
     */
    public void setModel(DataModel model) {
        this.model = model;
    }

    /**
     * @return the busca
     */
    public String getBusca() {
        return busca;
    }

    /**
     * @param busca the busca to set
     */
    public void setBusca(String busca) {
        this.busca = busca;
    }

    /**
     * @return the turmaFacade
     */
    public TurmaFacade getTurmaFacade() {
        return turmaFacade;
    }

    /**
     * @param turmaFacade the turmaFacade to set
     */
    public void setTurmaFacade(TurmaFacade turmaFacade) {
        this.turmaFacade = turmaFacade;
    }

    /**
     * @return the consulta
     */
    public List<Fatd> getConsulta() {
        return consulta;
    }

    /**
     * @param consulta the consulta to set
     */
    public void setConsulta(List<Fatd> consulta) {
        this.consulta = consulta;
    }

    /**
     * @return the tipo
     */
    public int getTipo() {
        return tipo;
    }

    /**
     * @param tipo the tipo to set
     */
    public void setTipo(int tipo) {
        this.tipo = tipo;
    }

    
    /**
     * @param esquadroes the esquadroes to set
     */
    public void setEsquadroes(Map<String, Object> esquadroes) {
        this.esquadroes = esquadroes;
    }

    /**
     * @return the selecionada
     */
    public Long getSelecionada() {
        return selecionada;
    }

    /**
     * @param selecionada the selecionada to set
     */
    public void setSelecionada(long selecionada) {
        this.selecionada = selecionada;
    }

O erro é o seguinte : a açào que preenche a tabela de acordo com as seleções funciona normalmente, porém na parte de busca por esquadrões ele só funciona quando eu faço uma busca primeiramente por número (id) da fatd… depois ela passa a buscar corretamente o esquadrão até ser misturada com outra cláusula de pesquisa…

o meu conversor é:

package intraer.sucoiccaer.conversores;

import ccaer.Fatd;
import intraer.afa.model.Turma;
import intraer.ccaer.controler.Ffatd;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

/**
 *
 * @author Andrade
 */
public class ConversorTurma implements Converter{

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Turma turma = null;

        try{
            FacesContext fc = FacesContext.getCurrentInstance();
            Ffatd ffatd = (Ffatd) fc.getApplication().getExpressionFactory().createValueExpression(fc.getELContext(),"#{ffatd}", Ffatd.class).getValue(fc.getELContext());
            Long id = Long.parseLong(value);
            turma = ffatd.getTurmaFacade().obterPorId(id);

        }catch(Exception ex){
            ex.printStackTrace();
        }        
        return turma;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        try{

            if (value != null && !(value instanceof Turma)){
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "O objeto não é uma turma !", "Conversor Turma");
                throw new ConverterException(message);
            }

            Turma turma = (Turma) value;
            return turma.getId().toString();
        }catch(Exception ex){
            return "0";
        }
    }
}
Criado 12 de novembro de 2009
Respostas 0
Participantes 1