[RESOLVIDO] - Incapaz de encontrar o construtor correto

19 respostas
Ramon.Onix

Bom, não sei bem o que esta acontecendo, sou cabaço em java ainda, mas conversando com o Mestre Lucas ele me pediu pra que colocasse o código aki!

[code] SEVERE: StandardWrapperValve [default]: PWC1406: Servlet.service () for servlet default jogou exceção
br.com.caelum.vraptor.http.InvalidParameterException: Impossível encontrar o construtor correto
...
...

Java.lang.Integer Caused by: java.lang.NoSuchMethodException:. ()
na java.lang.Class.getConstructor0 (Class.java: 2706)
na java.lang.Class.getDeclaredConstructor (Class.java: 1985)
na br.com.caelum.vraptor.http.ognl.GenericNullHandler.instantiate (GenericNullHandler.java: 70)
na br.com.caelum.vraptor.http.ognl.ReflectionBasedNullHandler.nullPropertyValue (ReflectionBasedNullHandler.java: 79)
[/ code]

Este erro ocorre o locatário tentar salvar um, provavelmente o erro Deve Ser nestas classes.
Modelo
[code]
javax.persistence importação .*;
org.hibernate.validator.Length importação;
org.hibernate.validator.NotNull de importação;

/ **
*
* @ Author Onix
* /
@ Entity
Locatario class (

@ Id
@ GeneratedValue
@ Column (name = id_locatario ")
private Integer id;
@ NotNull
@ Length (min = 3, max = 150)
@ Column (name = "locatario")
private String nome;
@ NotNull
@ Length (min = 3, max = 150)
condominio private String;
@ NotNull
@ Length (min = 3, max = 150)
Unidade private Integer;
@ NotNull
@ Length (min = 3, max = 150)
private String telefone;
@ NotNull

private String email;

getCondominio String () (
condominio de retorno;
)

setCondominio void (condominio String) (
this.condominio = condominio;
)

public String () (
e-mail de retorno;
)

public void (String email) (
this.email = email;
)

public Integer getId () (
return id;
)

public void setId (Integer id) (
this.id = id;
)

public String getNome () (
Nome de retorno;
)

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

getTelefone String () (
telefone de retorno;
)

setTelefone void (String telefone) (
this.telefone = telefone;
)

getUnidade public Integer () (
Unidade de retorno;
)

setUnidade void (unidade Integer) (
this.unidade = unidade;
)

)
[/ code]

Controlador
[code]
br.com.caelum.vraptor importação .*;
br.com.caelum.vraptor.validator.Hibernate de importação;
br.com.caelum.vraptor.validator.ValidationMessage de importação;
br.com.webcond.dao.CondominioDao de importação;
br.com.webcond.dao.LocatarioDao de importação;
br.com.webcond.dao.UnidadeDao de importação;
br.com.webcond.infra.Restrito de importação;
br.com.webcond.modelo.Locatario de importação;
import java.util.List;
br.com.caelum.vraptor.view.Results importação estática .*;

/ **
*
* @ Author Onix
* /
@ Resource
public class LocatarioController (

private DAO LocatarioDao final;
privado daoc CondominioDao final;
privado Daou UnidadeDao final;
Resultado resultado final privado;
privado validator validador final;

LocatarioController pública (LocatarioDao dao, CondominioDao daoc, UnidadeDao Daou, resultado Resultado, validator validador) (
this.dao = dao;
this.daoc = daoc;
this.daou = Daou;
resultado this.result =;
validador this.validator =;
)

@ Restrito
@ Path ( "locatario /")
@ Post
public void adiciona (Locatario locatario) (
if (dao.existeLocat (locatario)) (
ValidationMessage (validator.add novo ( "Já existe um locatário com este nome." locatario.nome "));
)
validator.addAll (Hibernate.validate (locatario)); / / importação do VRaptor
validator.onErrorUse (lógica ()). viar (LocatarioController.class). Novo ();

dao.salva (locatario);
result.redirectTo (LocatarioController.class). Lista ();
)

@ Restrito
@ Path ( "locatario / / (locatario.id)")
Put @
Altera void (Locatario locatario) (
validator.addAll (Hibernate.validate (locatario)); / / importação do VRaptor
validator.onErrorUse (lógica ()). viar (LocatarioController.class). Edita ();

dao.altera (locatario);
result.redirectTo (LocatarioController.class). Lista ();
)

@ Restrito
@ Path ( "locatario / / (id) / remover")
@ Delete
public void remove (Integer id) (
Locatario locatario = dao.carrega (id);
locatario (dao.remove);
result.redirectTo (LocatarioController.class). Lista ();
)

@ Restrito
@ Path ( "locatario / / (id) / Edita")
@ Get
Edita Locatario pública (Integer id) (
result.include ( "condominios", daoc.listaTudo ());
result.include ( "unidades", daou.listaTudo ());
dao.carrega return (id);
)

@ Restrito
@ Path ( "locatario /")
@ Get
Lista public List () (
dao.listaTudo retorno ();
)

@ Restrito
@ Path ( "/ locatario / Novo")
@ Get
Novo void () (
result.include ( "condominios", daoc.listaTudo ());
result.include ( "unidades", daou.listaTudo ());
)

@ Restrito
@ Path ( "locatario / / (id) / Edita")
@ Post
Edita void () (
)
)
[/ code]

E o Dao
[code]
br.com.caelum.vraptor.ioc.Component importação;
br.com.webcond.modelo.Locatario de importação;
import java.util.List;
importação org.hibernatee .*;
org.hibernate.criterion.Restrictions de importação;

/ **
*
* @ Author Onix
* /
@ Component
public class LocatarioDao (

private Session session;

LocatarioDao pública (Session session) (
sessão this.session =;
)

public void salva (Locatario locatario) (
Transaction tx = session.beginTransaction ();
locatario session.save ();
session.close ();
tx.commit ();
session.close ();
)

public void remove (locatario Locatario) (
Transaction tx = session.beginTransaction ();
session.delete (locatario);
session.close ();
tx.commit ();
session.close ();
)

Altera void (Locatario locatario) (
Transaction tx = session.beginTransaction ();
session.update (locatario);
session.close ();
tx.commit ();
session.close ();
)

public void atualiza (Locatario locatario) (
Transaction tx = session.beginTransaction ();
this.session.update (locatario);
session.close ();
tx.commit ();
session.close ();
)

existeLocat public boolean (Locatario locatario) (
Locatario encontrado = (Locatario session.createCriteria) (Locatario.class). Add (Restrictions.eq ( "nome", locatario.getNome ())). uniqueResult ();
encontrado retorno! = null;
)

Carrega Locatario pública (Integer id) (
return (Locatario this.session.load) (Locatario.class, id);
)

lista pública listaTudo () (
this.session.createCriteria retorno (Locatario.class). list ();
)
)
[/ code]

Se alguém puder me ajudar ...
Serei Grato!

19 Respostas

Lavieri

Vc tem um ComponentFactory para Session ?

Ramon.Onix

tenho um CriadorDeSessionFactory

import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

/**
 *
 * @author Onix
 */
@Component
@ApplicationScoped
public class CriadorDeSessionFactory implements ComponentFactory<SessionFactory> {

    private SessionFactory factory;

    @PostConstruct
    public void abre() {
        AnnotationConfiguration configuration = new AnnotationConfiguration();
        configuration.configure();

        this.factory = configuration.buildSessionFactory();
    }

    public SessionFactory getInstance() {
        return this.factory;
    }

    @PreDestroy
    public void fecha() {
        this.factory.close();
    }
}

Seria isso?

Lavieri

nop seria um assim

@Component  
 public class CriadorDeSession implements ComponentFactory&lt;Session&gt; { 
        CriadorDeSession(SessionFactory factory) {
           //...
         }

    public  Session getInstance() {  
        this.session = this.factory.openSession;
        return session;
    } 

     @PreDestroy  
     public void fecha() {  
         if (session != null && session.isOpen()) session.close();  
     }  
 }
Ramon.Onix

CriadorDeSession ?
Entendi errado sua pergunta... Foi mal

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.hibernate.*;

/**
 *
 * @author Onix
 */
@Component
public class CriadorDeSession implements ComponentFactory<Session> {

    private final SessionFactory factory;
    private Session session;

    public CriadorDeSession(SessionFactory factory) {
        this.factory = factory;
    }
    @PostConstruct
    public void abre(){
        this.session = factory.openSession();
    }

    public Session getInstance() {
        return this.session;
    }
    @PreDestroy
    public void fecha(){
        this.session.close();
    }
}

Mas como seria o CriadorDeSession se nas demais lógicas não dá erro?

Lavieri

bem estranho, pois ele esta relcmanado que não acha o construtor correto…

tem mais de 1 construtor não ? como o construtor vazio ?

Ramon.Onix

Não tem!
E só dá erro nesta fase, apenas na hr de salvar um locatário!
Tudo funciona, menos isso!

Lavieri

vc esta usando _method=“put” na hora de enviar ?

Ramon.Onix

Vc fala na view?
Na View eu to usando “POST”

G

O mais bizarro é saber que ele não encontra o construtor default da classe integer.

Será que é porque integer não possui um construtor padrão? :lol:

Lucas_Cavalcanti

posta seu formulário de adição de locatários por favor

Ramon.Onix
<%@page contentType="text/html;charset=ISO-8859-1" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Novo Locatário</title>
        <link rel="stylesheet" type="text/css" href="<c:url value="/css/estilos.css"/>"/>
        <script type="text/javascript" src="<c:url value="/js/jquery-1.3.2.min.js"/>"></script>
        <script type="text/javascript" src="<c:url value="/js/jquery.validate.js"/>"></script>
        <script type="text/javascript" src="<c:url value="/js/valUs.js"/>"></script>
        <script type="text/javascript" src="<c:url value="/js/dica.js"/>"></script>
    </head>
    <body>
        <div id="conteudo">
            <div id="head"></div>
            <ul style="font-size: 8pt; color: #FF0000">
                <c:forEach items="${errors}" var="error">
                    <li>${error.category } - ${error.message }</li>
                </c:forEach>
            </ul>
            <form id="novoLocat" class="form" action="<c:url value="/locatario"/>" method="POST">
                <table cellpadding="2" cellspacing="2" style="font-size: small">
                    <tr>
                        <td><label for="nome">Locatário:</label></td>
                        <td><input id="nome" type="text" name="locatario.nome" value="${locatario.nome}"/></td>
                    </tr>
                    <tr>
                        <td><label for="condominio">Condomínio:</label></td>
                        <td><select id="condominio" name="locatario.condominio.id">
                                <c:forEach items="${condominios}" var="condominio">
                                    <option value="${condominio.id}">${condominio.nome}</option>
                                </c:forEach>
                            </select></td>
                    </tr>
                    <tr>
                        <td><label for="unidade">Unidade:</label></td>
                        <td><select id="unidade" name="locatario.unidade.id">
                                <c:forEach items="${unidades}" var="unidade">
                                    <option value="${unidade.id}">${unidade.nomeun}</option>
                                </c:forEach>
                            </select></td>
                    </tr>
                    <tr>
                        <td><label for="telefone">Telefone:</label></td>
                        <td><input id="telefone" type="text" name="locatario.telefone" value="${locatario.telefone}"/></td>
                    </tr>
                    <tr>
                        <td><label for="email">E-mail:</label></td>
                        <td><input id="email" type="text" name="locatario.email" value="${locatario.email}"/></td>
                    </tr>                   
                    <tr></tr>
                    <tr></tr>
                    <tr>
                        <td colspan="2"><button type="submit">Cadastrar</button></td>
                    </tr>
                </table>
            </form>
        </div>
    </div>
</body>
</html>
G

Eu tive esse erro quando tentei usar o iogi. Tudo que é parametro de método ele tentava chamar o construtor padrão. Obvio que nos casos das wrappers dos tipos primitivos daria me***.

Pela stacktrace não me parece nada a ver com SessionFactory nem mesmo com a view. A impressão que tenho, posso estar errado, é algo interno na hora de injetar os parametros no método.

Você pode nos passar a stacktrace inteira, Ramon.Onix?

Uma observação: você não precisa dessa CriadorDeSession, pois o vraptor já faz isso para você: http://vraptor.caelum.com.br/documentacao/componentes-utilitarios-opcionais/

Ramon.Onix

Sr. Garcia-jj, eu estou aprendendo ainda! E na apostila que estava seguindo tinha um criador de session… Mas eu vou ver como retiro!

Bom o Stack Trace ta ai como vc me pediu:

SEVERE: StandardWrapperValve[default]: PWC1406: Servlet.service() for servlet default threw exception br.com.caelum.vraptor.http.InvalidParameterException: Unable to find the correct constructor at br.com.caelum.vraptor.http.ognl.ReflectionBasedNullHandler.nullPropertyValue(ReflectionBasedNullHandler.java:98) at ognl.ASTProperty.getValueBody(ASTProperty.java:118) at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) at ognl.SimpleNode.getValue(SimpleNode.java:236) at ognl.ASTChain.setValueBody(ASTChain.java:222) at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220) at ognl.SimpleNode.setValue(SimpleNode.java:279) at ognl.Ognl.setValue(Ognl.java:737) at ognl.Ognl.setValue(Ognl.java:783) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:133) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:90) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:83) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:68) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42) at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:250) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:218) at org.apache.catalina.core.StandardWrapperValve.preInvoke(StandardWrapperValve.java:460) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:139) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:186) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:719) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:657) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:96) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:187) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:719) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:657) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:651) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1030) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:142) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:719) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:657) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:651) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1030) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:242) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:180) at com.sun.grizzly.http.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:633) at com.sun.grizzly.http.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:570) at com.sun.grizzly.http.DefaultProcessorTask.process(DefaultProcessorTask.java:827) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:152) at com.sun.enterprise.v3.services.impl.GlassfishProtocolChain.executeProtocolFilter(GlassfishProtocolChain.java:71) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:103) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:89) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:67) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:56) at com.sun.grizzly.util.WorkerThreadImpl.processTask(WorkerThreadImpl.java:325) at com.sun.grizzly.util.WorkerThreadImpl.run(WorkerThreadImpl.java:184) Caused by: java.lang.NoSuchMethodException: java.lang.Integer.<init>() at java.lang.Class.getConstructor0(Class.java:2706) at java.lang.Class.getDeclaredConstructor(Class.java:1985) at br.com.caelum.vraptor.http.ognl.GenericNullHandler.instantiate(GenericNullHandler.java:70) at br.com.caelum.vraptor.http.ognl.ReflectionBasedNullHandler.nullPropertyValue(ReflectionBasedNullHandler.java:79) ... 67 more

Ramon.Onix

Só por curiosidade mudei o Integer unidade, na classe locatario, por String unidade, o erro não acontece mais ao salvar, mas não salva pq o Nome do Condominio não passou na validação, @Length(min = 3, max = 150).
A combo está vindo preenchida, mas na hr de enviar deve estar indo vazia! Seilá, agora só sei que nada sei!

Lucas_Cavalcanti

Você não deve ter um parâmetro String unidade ou Integer unidade! Faça Unidade unidade; que vai funcionar… lembre-se de colocar @ManyToOne pro hibernate funcionar

Ramon.Onix

Mas eu não queria “amarrar” a tabela locatário. Entende?

e o que não está funcionando é condominio, ele preenche a combo, mas não consegue salvar!

Lucas_Cavalcanti

se você não vai usar relacionamento entre objetos, troque os nomes dos seus comboboxes para:

<select name="locatario.unidade">...
<select name="locatario.condominio">...

de qqer forma, qual é o seu motivo para não “amarrar” os objetos? Você perde um monte de funcionalidades legais do Hibernate quando vc não faz isso…

Ramon.Onix

Lucas, mesmo fazendo como vc disse, não funciona ainda!
O combo condominio não passa na validação do Hiber.

Coloquei o private Unidade unidade, coloquei os Get&Set, mesmo assim o combo condominio, não passa, deve ter algo que não fiz ou errei!

Ramon.Onix

Fiz como o Lucas falou e apaguei as tabelas do banco, funcionou direitinho!

vlw ai galera mais uma vez!
Obrigado Lucas, tu é o cara!

Criado 20 de março de 2010
Ultima resposta 22 de mar. de 2010
Respostas 19
Participantes 4