Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Autopreenchimento não funcionando

Erm... Então, a priori o meu projeto é um pouco diferente, mas eu o estou fazendo acompanando os vídeos do curso. Ao invés de "conta" para a inserção no banco proposto, estou com um banco próprio e, no caso, preenchendo a tabela "utilisateur" (cujos DAO's eu já fiz com ajuda do curso JDBC). Existe uma classe "utilisateur" nos modelos e eu recebo o POST através de um método "ajouteUsr", no meu "UtilisateursController". Pois bem, este é o método: ´´´

@RequestMapping("/ajouteUsr")

public String ajouteUsr( Utilisateur usr){


    UtilisateurDAO usr_dao = new UtilisateurDAO();
    usr_dao.setAutoCommit(false);

    try {
        usr_dao.insert(usr);
        usr_dao.commit();
        return "redirect:/listUsr";
    }catch(SQLException ex) {
        usr_dao.rollback();
        return "usr/cad_fail";
    }

}

´´´

O problema é que o objeto Utilisateur usr é sempre completado como "null" e valores nulos estão sendo inseridos no meu banco :'(

Eu consigo fazer funcionar de maneira mais arcaica, com o seguinte projeto para a classe ajouteUsr:

´´´

@RequestMapping("/ajouteUsr")

    public String ajouterUsr( 
            @RequestParam("nom") String nom, @RequestParam("prenom") String prenom,
            @RequestParam("naissance") String nsc, @RequestParam("mot_de_passe") String mot
            ){



        Utilisateur usr = new Utilisateur(nom, prenom, nsc, mot);



        UtilisateurDAO usr_dao = new UtilisateurDAO();
        usr_dao.setAutoCommit(false);
        System.out.println(usr.get_prenom());

        System.out.println(usr.get_nom());

        System.out.println(usr.get_naissance());
        try {
            usr_dao.insert(usr);
            usr_dao.commit();
            return "redirect:/listUsr";
        }catch(SQLException ex) {
            usr_dao.rollback();
            return "usr/cad_fail";
        }

}

´´´

Neste padrão apresentado, os dados são recebidos e corretamente cadastrados. Mas é óbvio que eu gostaria de utilizar a maneira mais ágil.

Caso seja necessário, posso disponibilizar a jsp e a classe Utilisateur também. Já verifiquei mútiplas vezes se os campos batiam com os da jsp e está tudo correto ao que me parece.

Agradeço qualquer ajuda desde já!

7 respostas

Fala Thomas, tudo bem?

Você consegue colocar um breakpoint nessa linha:

public String ajouteUsr( Utilisateur usr){

e debugar para vermos se o valor usr está vindo null do JSP?

Abraço!

Opa, obg pela resposta. Eu modifiquei o método como sugerido e mandei printar o objeto "usr", tal como seus atributos:

´´´

@RequestMapping("/ajouteUsr")

public String ajouteUsr( Utilisateur usr){


    //debug:
    System.out.println("\n\n usr: "+usr+"\n\n");
    System.out.println("prenom: "+usr.get_prenom());
    System.out.println("nom:"+ usr.get_nom());
    System.out.println("naissance:"+ usr.get_naissance());
    //end debug


    UtilisateurDAO usr_dao = new UtilisateurDAO();
    usr_dao.setAutoCommit(false);
    try {
        usr_dao.insert(usr);
        usr_dao.commit();
        return "redirect:/listUsr";
    }catch(SQLException ex) {
        usr_dao.rollback();
        return "usr/cad_fail";
    }
}

´´´

O retorno foi o seguinte no console do Tomcat:

[...]

21:43:20,721 INFO DispatcherServlet:498 - FrameworkServlet 'spring mvc': initialization completed in 1807 ms

usr: br.com.caelum.contas.modelo.Utilisateur@7d395889

prenom: null

nom:null

naissance:null

[...]

O objeto é instanciado, okay... mas os atributos deles não são preenchidos. Estes sim estão nulos. Seria um problema com o construtor que não está instanciando o objeto?

Segue, aqui abaixo, a classe referente:

.

´´´

//diversas importações

@Component("Utilisateur") public class Utilisateur {

private int id;
@NotNull
private String prenom;
@NotNull
private String nom;
@NotNull
private String naissance;
@NotNull @Size(min=5)
private String mot_de_passe;


//CONSTRUCTEURS

public Utilisateur() {

}

public Utilisateur(String nom, String prenom, String naissance, String mot_de_passe) {
    this.nom = nom;
    this.prenom = prenom;
    this.naissance = naissance;
    this.mot_de_passe = mot_de_passe;
}


//MÉTHODES

//getters
public int get_id(){
    return this.id;
}
public String get_prenom(){
    return this.prenom;
}
public String get_nom(){
    return this.nom;
}
public String get_naissance(){
    return this.naissance;
}
public String get_mot_de_passe(){
    return this.mot_de_passe;
}


//setters
public void set_id(int id){
    this.id = id;
}
public void set_prenom(String prenom){
    this.prenom = prenom;
}
public void set_nom(String nom){
    this.nom = nom;
}
public void set_naissance(String naissance){
    this.naissance = naissance;
}

}

´´´

Alguma ideia? Se o apoio não puder ser prosseguido, agradeceria um aviso prévio - pra não ficar aguardando em vão e tudo mais.

Thomas,

Como você mudou os nomes, os atributos da sua entidade "utilisateur" que deve estar como parâmetro no método mapeado do "UtilisateursController" provavelmente não está batendo com os names que você definiu no seu JSP.

Olá, novamento obg pela resposta. Pois é, eu também desconfiei a priori.

No entanto, como podemos ver no jsp abaixo, os campos estão em total concordância com o modelo proposto:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Formulaire d'Utilisateurs</title>

</head>

<body>

    <h1>Formulaire d'Utilisateurs</h1>
    <hr>
    <br>

    <form method ="post" action="ajouteUsr">
        <h3>Prénom</h3> 
        <input type="text" name="prenom" >
        <br>
        <h3>Nom</h3>
        <input type = "text" name="nom" >
        <br>
        <h3>Naissance</h3>
        <input type="date" name="naissance" >
        <br>
        <h3>Mot de Passe</h3>
        <input type='password' name="mot_de_passe">
        <input type="submit" value = "Enregistrer">
    </form>
</body>
``

Os atributos que deveriam ser inicializados estão bem grafados. São eles: nom, prenom, naissance e mot_de_passe (todos recebidos como Strings pela classe Utilisateur)

solução!

Thomas,

Tenta deixar os getters e setters de acordo com a convenção do Java (camelCase):

Exemplo, troque:

public void set_id(int id){
    this.id = id;
}

por

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

Nossa, quem diria que era esse o erro durante todo esse tempo! Muitíssimo obrigado pelo apoio, tudo está funcionando corretamente agora.

Aparentemente o hábito de usar snake case acabou me atrapalhando :P

Novamente obg, problema solucionado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software