Bonjour,
J'ai acheté récemment un livre qui parle de JPA (Cahiers du programmeur : Java EE 5). Je l'ai lu et je voudrais appliquer son fonctionnement sur un projet de test.
Mon projet consiste à la mise en place d'une page JSP d'authentification. J'ai une base avec une table Utilisateur qui contient login et mot de passe. J'ai donc installé Hibernate tools sur mon Eclipse. J'ai effectué un revers engineering code pour qu'il me génère mes classes entities et bean.
J'ai ensuite crée une page login avec la mise en place de Struts 2 pour la saisie du login et mot de passe.
Dans mon Action du formulaire, je veux vérifier que mon mot de passe correspond bien au login. J'ai dans mon UtilisateurBean (généré via Hibernate tools) une méthode authentification qui effectue cette vérification.
Voici le code de mon UtilisateurEntity :
Voici le code de mon Bean :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 package com.sciencesu.gipid.entity.acteur; // Generated 25 juin 2009 22:19:09 by Hibernate Tools 3.2.4.GA import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import com.sciencesu.gipid.Exceptions.ExceptionDistante; /** * Utilisateur generated by hbm2java */ @Entity @Table(name = "utilisateur", schema = "public") public class Utilisateur implements Serializable { /** * */ private static final long serialVersionUID = 1L; private int idPersonne; private Client client; private Technicien technicien; private Responsable responsable; private String nomUtilisateur; private String motDePasse; private Boolean actif; public Utilisateur() { } public Utilisateur(int idPersonne) { this.idPersonne = idPersonne; } public Utilisateur(int idPersonne, String nomUtilisateur, String motDePasse,Boolean actif) { this.idPersonne = idPersonne; this.nomUtilisateur = nomUtilisateur; this.motDePasse = motDePasse; this.actif = actif; } @Id @Column(name = "id_personne", unique = true, nullable = false) public int getIdPersonne() { return this.idPersonne; } public void setIdPersonne(int idPersonne) { this.idPersonne = idPersonne; } @Column(name = "nom_utilisateur", length = 10) public String getNomUtilisateur() { return this.nomUtilisateur; } public void setNomUtilisateur(String nomUtilisateur) { this.nomUtilisateur = nomUtilisateur; } @Column(name = "mot_de_passe") public String getMotDePasse() { return this.motDePasse; } public void setMotDePasse(String motDePasse) { this.motDePasse = motDePasse; } @Column(name = "actif") public Boolean getActif() { return this.actif; } public void setActif(Boolean actif) { this.actif = actif; } /** * Méthode permettant de vérifier le mot de passe de l'utilisateur. * * @param pwd * @throws ExceptionDistante * Lève une exception si le password est incorrect. */ public void verifierMotDePasse(String pPassword) { if (pPassword == null || "".equals(pPassword)) { throw new ExceptionDistante("Invalid password"); } // The password entered by the customer is not the same stored in // database if (!pPassword.equals(this.motDePasse)) { throw new ExceptionDistante("Passwords doen't match"); } } }
Mon soucis consiste à appeler le méthode authentification pour vérifier que le login et mot de passe correspondent :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 package com.sciencesu.gipid.stateless.acteur.utilisateur; import java.util.logging.Logger; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContextType; import javax.persistence.Query; import com.sciencesu.gipid.Exceptions.ExceptionDistante; import com.sciencesu.gipid.entity.acteur.Utilisateur; import com.sciencesu.gipid.util.Constantes; @TransactionAttribute(value = TransactionAttributeType.REQUIRED) @Stateless(name = "UtilisateurSB", mappedName = "ejb/stateless/Utilisateur") public class UtilisateurBean implements UtilisateurLocal, UtilisateurRemote { @PersistenceContext(unitName = "gipidPU", type=PersistenceContextType.EXTENDED) private EntityManager entityManager; private final String cname = this.getClass().getName(); private Logger logger = Logger.getLogger(Constantes.LOGGER_STATELESS); /** * Authentification de l'utilisateur * * @param transientInstance */ public Utilisateur authentification(String pLogin, String pPassword) throws ExceptionDistante { final String mname = "authentification"; logger.entering(cname, mname, new Object[]{pLogin,pPassword}); // On s'assure de la validité des paramètres if (pLogin == null || "".equals(pLogin)) { throw new ExceptionDistante("Invalid login"); } Query lQuery; Utilisateur lUtilisateur; lQuery = entityManager.createQuery("SELECT u FROM Utilisateur u WHERE u.login=:login"); lQuery.setParameter("login", pLogin); lUtilisateur = (Utilisateur) lQuery.getSingleResult(); if (lUtilisateur != null) { lUtilisateur.verifierMotDePasse(pPassword); } logger.exiting(cname, mname, lUtilisateur); return lUtilisateur; } }
Bon j'ai repris le code du libre et adapté ce dernier mais j'ai le droit à un null pointer exception sur le :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 @EJB private UtilisateurLocal mUtilisateurBean; private boolean estValide(String pLogin, String pPassword) { Utilisateur lUtilisateur = null; try { lUtilisateur = mUtilisateurBean.authentification(pLogin, pPassword); } catch (ExceptionDistante lExpDist) { lUtilisateur = null; } if (lUtilisateur == null) { return false; } else { mLogin = lUtilisateur.getNomUtilisateur(); mPassword = lUtilisateur.getMotDePasse(); return true; } }
Ce qui est normal vu que je ne l'instancie pas... mais ils ne le font pas non plus dans le livre...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 lUtilisateur = mUtilisateurBean.authentification(pLogin, pPassword);
Si je passe par un lookup pour récupérer l'objet ça fonctionne bien mais j'ai un null pointer exception à cette ligne dans le bean :
mais si j'ai bien compris ce doit être le serveur qui doit instancié les entity manager et pas nous ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 lQuery = entityManager.createQuery("SELECT u FROM Utilisateur u WHERE u.login=:login");
Si quelqu'un connaitrait un tuto ou pourrait m'aider à résoudre mon problème ???
Par avance, merci !
Partager