Problema com Serialização com EJB

4 respostas
F

Pessoal, estou com pequeno probleminha.
Estou fazendo uma aplicação usando servlet e EJB3.0 com glassFish.

Esta ocasionando erro quando tento enviar um objeto de uma classe para o EJB, quando tento criar uma instancia de um classe que esta armazenada no meu EJB ele lança um Erro:

nested exception is: java.rmi.MarshalException: CORBA MARSHAL [telefone removido] Maybe; nested exception is: org.omg.CORBA.MARSHAL:
(SSLWorkerThread.java:106) Caused by: java.io.IOException: Mismatched serialization UIDs : Source (Rep. IDRMI:horasAtividades.estrutura.model.Evento:2EEE6EA9D4F0C981:0000000000000001) = 0000000000000001 whereas Target (Rep. ID RMI:horasAtividades.estrutura.model.Evento:2EEE6EA9D4F0C981:02D8897AB20CE166) = 02D8897AB20CE166 at com.sun.corba.ee.impl.util.RepositoryId.useFullValueDescription(RepositoryId.java:650) at com.sun.corba.ee.impl.io.

Creio eu que esse erro esta sendo ocasionado na serialização da classe Evento… Pois não consegui pegar o numero de UID da serialização, portanto coloquei como 1L, como no exemplo:

public class Evento implements Serializable{
    private static final long serialVersionUID = 1L;
    
    private int id;
    private String nome;
    //getters e setters
}

Minha dúvida é o seguinte… como faço para pegar esse serialVersionUID , ja usei serivalver, mas não consigo encontrar a classe…

serialver Evento.class

Nesse código ele me retorna que não encontrou a classe, ja coloquei o -classpath… mas mesmo assim não encontrou.
Alguém pode me indicar onde esta o erro, o porque não consigo pegar esse número?

4 Respostas

Jair_Rillo_Junior

Eu não entendi muito bem o seu problema. Você está enviando um objeto para o EJB? E dentro do EJB você tenta instanciar a classe do Objeto? Como assim… pode postar o código para ficar mais claro?

F

Eu criei no proprio servlet uma instancia da classe Evento:

//Servlet

import java.io.*;
import java.net.*;

import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import horasAtividades.estrutura.ejb.GerenciarEstruturasRemote;
import horasAtividades.estrutura.model.Evento;




public class horasAtividades extends HttpServlet {

    @EJB
    private GerenciarEstruturasRemote gerenciar;
    
   
    
      public Evento criarEvento(int id, String nome){
        Evento evt = new Evento();
        evt.setId(id);
        evt.setNome(nome);
        return evt;
    }
              
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
         
        
        try {
            
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet horasAtividades</title>");  
            out.println("</head>");
            out.println("<body>");
            out.println("Testes...<br>");           
            Evento aux = gerenciar.salvarEvento(criarEvento(12, "Teste"));  
            out.println("Evento :" + aux.getNome()+"<br>" );
            out.println("Id Evento :" + aux.getId() );
            out.println("</body>");
            out.println("</html>");
            
        }catch (Exception e){
             
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet horasAtividades</title>");  
            out.println("</head>");
            out.println("<body>");
            out.println("Errooo...<br>"+e.getMessage());           
          
            out.println("</body>");
            out.println("</html>");
        }
        
        
        finally {
         
            out.close();
        }
    }

//Model do EJB

package horasAtividades.estrutura.model;
import java.io.Serializable;


public class Evento implements Serializable{
    private static final long serialVersionUID = 1L;
    
    private int id;
    private String nome;

    public int getId() {             
                
        return id;
    }   
    
    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
    
    

}

//Meu EJB

package horasAtividades.estrutura.ejb;


import javax.ejb.Stateless;
import horasAtividades.estrutura.model.Evento;
import java.util.List;

public class GerenciarEstruturasBean implements GerenciarEstruturasRemote {

    public List<Evento> eventos;
    public Evento salvarEvento(Evento evento) {
        eventos.add(evento);
        return evento;
    }

 
}

Essa é a estrutura que estou usando… isso que gera o erro, agora não sei se na minha classe Evento tenho que colocar o serialVersionUID …

Jair_Rillo_Junior

Tem algo estranho ai…
vc está armazenando uma Lista de Eventos em um Session Bean Stateless?? A cada request esse SessionBean irá se perder e assim sua lista irá sempre estar zerada.

Mude para Statefull que ai irá fazer mais sentido. No caso do Statefull, temos o lance de Passivate/Activate. Portanto, aconselho por o Serializable tb no seu SessionBean (para ele não perder dados no passivate/activate).

Faz esses testes

F

Verdade… não me atentei nesse detalhe… to começando ainda nessa parte do EJB… vou seguir o que você me falou, realmente a cada solicitação a thead morre… e retorna nulo…

valeu…

Criado 11 de setembro de 2008
Ultima resposta 11 de set. de 2008
Respostas 4
Participantes 2