Intanciando classe Abstrata

17 respostas
surfzera

Pessoal fiz metodo que instancia uma classe abstrata, quando rodo uma classe de Test em modo desktop ela funciona perfeitamente. Quando utilizo ela em modo Web a classe não é instanciada corretamente;

vejam:

Metodo dentro da classe Pessoa:

public final VinculoPessoa criarVinculo(int cdVinculo) {
        Map<Integer, Class<?>> vMap = new HashMap<Integer, Class<?>>();

        vMap.put(Administrador.CD_VINCULO, Administrador.class);
        vMap.put(Prestador.CD_VINCULO, Prestador.class);
        vMap.put(Colaborador.CD_VINCULO, Colaborador.class);
        vMap.put(Cliente.CD_VINCULO, Cliente.class);
        vMap.put(VinculoCNU.CD_VINCULO, VinculoCNU.class);
        vMap.put(VinculoFornecedor.CD_VINCULO, VinculoFornecedor.class);
        vMap.put(VinculoParticipacoes.CD_VINCULO, VinculoParticipacoes.class);

        VinculoPessoa vp = null;
        try {

            final Class<VinculoPessoa> clazz = (Class<VinculoPessoa>) vMap.get(cdVinculo);
           
            Constructor<VinculoPessoa> constructor = clazz.getConstructor(Pessoa.class);
            vp = constructor.newInstance(new Object[]{this});
            
            vinculosPortal.add(vp);
            
        } catch (NoSuchMethodException e) {
            conf.Log.logControlMsg(this, conf.Log.LEVEL_ERRO, e);
        } catch (InvocationTargetException e) {
            conf.Log.logControlMsg(this, conf.Log.LEVEL_ERRO, e);
        } catch (IllegalAccessException e) {
            conf.Log.logControlMsg(this, conf.Log.LEVEL_ERRO, e);
        } catch (InstantiationException e) {
            conf.Log.logControlMsg(this, conf.Log.LEVEL_ERRO, e);
        }
       
        return vp;   
    }

17 Respostas

surfzera
surfzera:
Pessoal fiz metodo que instancia uma classe abstrata, quando rodo uma classe de Test em modo desktop ela funciona perfeitamente. Quando utilizo ela em modo Web a classe não é instanciada corretamente;

vejam:

Metodo dentro da classe Pessoa:
public final VinculoPessoa criarVinculo(int cdVinculo) {
        Map<Integer, Class<?>> vMap = new HashMap<Integer, Class<?>>();

        vMap.put(Administrador.CD_VINCULO, Administrador.class);
        vMap.put(Prestador.CD_VINCULO, Prestador.class);
        vMap.put(Colaborador.CD_VINCULO, Colaborador.class);
        vMap.put(Cliente.CD_VINCULO, Cliente.class);
        vMap.put(VinculoCNU.CD_VINCULO, VinculoCNU.class);
        vMap.put(VinculoFornecedor.CD_VINCULO, VinculoFornecedor.class);
        vMap.put(VinculoParticipacoes.CD_VINCULO, VinculoParticipacoes.class);

        VinculoPessoa vp = null;
        try {

            final Class<VinculoPessoa> clazz = (Class<VinculoPessoa>) vMap.get(cdVinculo);
           
            Constructor<VinculoPessoa> constructor = clazz.getConstructor(Pessoa.class);
            vp = constructor.newInstance(new Object[]{this});
            
            vinculosPortal.add(vp);
            
        } catch (NoSuchMethodException e) {
            conf.Log.logControlMsg(this, conf.Log.LEVEL_ERRO, e);
        } catch (InvocationTargetException e) {
            conf.Log.logControlMsg(this, conf.Log.LEVEL_ERRO, e);
        } catch (IllegalAccessException e) {
            conf.Log.logControlMsg(this, conf.Log.LEVEL_ERRO, e);
        } catch (InstantiationException e) {
            conf.Log.logControlMsg(this, conf.Log.LEVEL_ERRO, e);
        }
       
        return vp;   
    }

Erro:

br.com.unimed.portal.pessoa.colaborador.Colaborador.(Colaborador.java:145)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

Hebert_Coelho

Você ta tentando utilizar essa classe com algum framework?

surfzera

Não tentei… qual framework posso utilizar ?

Hebert_Coelho

surfzera:
Não tentei… qual framework posso utilizar ?
Eu digo, na view. Você está tentando utilizar esse objeto em alguma página? Em algum framework? Quando acontece esse erro?

Rodrigo_Sasaki

surfzera:

Erro:

br.com.unimed.portal.pessoa.colaborador.Colaborador.(Colaborador.java:145)

sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)</blockquote>

Isso não é o erro, poste a stacktrace completa.

Você sabe que não pode instanciar uma classe abstrata, correto?

wagnerfrancisco

Posta a parte relevante da classe Colaborador também. Principalmente o construtor.

surfzera

Segue

Construtor da Classe Colaborador:

public Colaborador(Pessoa pessoa) {
        super(pessoa);
 }
surfzera

Segue Erro completo:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException

org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848)

org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)

org.apache.jsp.uploadCSV_jsp._jspService(org.apache.jsp.uploadCSV_jsp:94)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)

javax.servlet.http.HttpServlet.service(HttpServlet.java:810)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)

javax.servlet.http.HttpServlet.service(HttpServlet.java:810)

org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)

root cause

java.lang.ExceptionInInitializerError

br.com.unimed.portal.pessoa.colaborador.Colaborador.(Colaborador.java:145)

sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)

sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

java.lang.reflect.Constructor.newInstance(Constructor.java:513)

br.com.unimed.portal.pessoa.Pessoa.criarVinculo(Pessoa.java:248)

br.com.unimed.portal.colaborador.CargaColaborador.popularPessoaFisica(CargaColaborador.java:125)

br.com.unimed.portal.colaborador.CargaColaborador.lerArquivoCsv(CargaColaborador.java:86)

org.apache.jsp.uploadCSV_jsp._jspService(org.apache.jsp.uploadCSV_jsp:77)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)

javax.servlet.http.HttpServlet.service(HttpServlet.java:810)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)

javax.servlet.http.HttpServlet.service(HttpServlet.java:810)

org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.9 logs.

Hebert_Coelho

O que tem nessa linha?
br.com.unimed.portal.pessoa.colaborador.Colaborador.(Colaborador.java:145)

surfzera

Hebert

Esta sendo usado Refletion utilizando a classe Contructor, não entendi bem se é isso que você quis dizer:

import java.lang.reflect.Constructor;

final Class<VinculoPessoa> clazz = (Class<VinculoPessoa>) vMap.get(cdVinculo);  
Constructor<VinculoPessoa> constructor = clazz.getConstructor(Pessoa.class);  
vp = constructor.newInstance(new Object[]{this});
surfzera

Linha 145 classe Colaborador:

144 - public static final int CD_VINCULO = 3;
145 - private static TipoVinculoPessoa tp_vinculo = TipoVinculoPessoa.getInstanceOf(CD_VINCULO);
Hebert_Coelho

Eu ACHO que o seu servidor está se perdendo na hora de instanciar a classe. Creio que a solução seria criar um classloader próprio, mas não sei te falar ao certo como seria.

surfzera

Então aproveitando o gancho estou usando o JBOSS 4.0.2

thiago_pco

Só uma pergunta.

Sua classe Colaborador tem um contrutor default?
Vi que existe um construtor recebendo uma Pessoa, o que a deixa sem o construtor default.

surfzera

Sim a classe Colaborador tem um Contrutor:

public Colaborador(Pessoa pessoa) {
        super(pessoa);
    }
surfzera

[email removido] - Não entendi oque você que dizer! Pode me explicar melhor ?

thiago_pco

Alguns frameworks utilizam o contrutor default ou padrão para inicializar classes. Por padrão toda classe java sem um construtor explícito possui um construtor default.
Porém quando criamos um construtor com parâmetros diferentes o default deixa de existir.
Como sua classe possui um construtor recebendo uma Pessoa, provavelmente não possui mais o construtor padrão(Caso não seja adicionado explicitamente), que seria algo do tipo:

public Colaborador(){
}
Criado 7 de novembro de 2012
Ultima resposta 8 de nov. de 2012
Respostas 17
Participantes 5