Bonjour,
Lors de l'authentification d'un étudiant, je souhaite rechercher s'il est déjà inscrit à un stage afin de lui proposer une interface différente sur sa page d'accueil.
Voici un extrait du code de Authenticator.java :
Sans la seconde requête, la connexion se passe bien et l'utilisateur accède à sa page d'accueil. Avec la requête de recherche de stage, j'obtiens ceci dans la console d'Eclipse :
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 public boolean authenticate() { try { log.info("authenticating {0}", credentials.getUsername()); Query query = entityManager.createQuery( "FROM ThUtilisateurUti u " + "WHERE u.utiLogin = :username " + "AND u.utiMotPasse = :password"); query.setParameter("username", credentials.getUsername()); //query.setParameter("password", ThUtilisateurUti.generateMD5(credentials.getPassword())); query.setParameter("password", credentials.getPassword()); this.user = (ThUtilisateurUti) query.getSingleResult(); int typeUtilisateur = user.getTeTypeUtilisateurTu().getTuId(); identity.addRole(user.getTeTypeUtilisateurTu().getTuLibelle()); switch (typeUtilisateur) { case 1 : // Administrateur setPageSuivante("/home.xhtml"); return true; case 2 : // Gestionnaire case 3 : // Étudiant log.info("authenticating {0} - Authentifié en tant qu'étudiant"); setNom(user.getPrsNom()); setPrenom(user.getPrsPrenom()); setPageSuivante("/accueilEtudiant.xhtml"); // Recherche si l'étudiant est déjà inscrit à un stage Query q = entityManager.createQuery( "SELECT thStageStg " + "FROM ThStageStg thStageStg " + "JOIN thStageStg.teEtablissementEtb etb " + "JOIN etb.trCommuneCmn c " + "JOIN c.trDepartementDpt d " + "JOIN thStageStg.thCandidatCnds cnd " + "WHERE cnd.utiLogin = :login "); //q.setParameter("login", user.getUtiLogin()); q.setParameter("login", "etutest"); stage = (ThStageStg) q.getSingleResult(); log.info("authenticating {0} - après requête sur le stage"); return true; } setPageSuivante("/login.xhtml"); return false; } catch (NoResultException ex) { //setPageSuivante("/login.xhtml"); return false; } }
Je ne pense pas que ce soit dû à l'erreur de validation sur une entité puisque j'ai aussi cette erreur sans la seconde requête et que ça marche quand même. D'ailleurs, si quelqu'un peut m'expliquer de quoi il s'agit, je suis preneur.12:23:00,594 INFO [Authenticator] authenticating {0} - Authentifié en tant qu'étudiant
12:23:00,620 DEBUG [EntityTransaction] marking JPA resource-local transaction for rollback
12:23:00,621 WARN [SeamLoginModule] Error invoking login method
javax.el.ELException: org.hibernate.validator.InvalidStateException: validation failed for: org.domain.stamas.entity.ThEtudiantEtu
...
Caused by: org.hibernate.validator.InvalidStateException: validation failed for: org.domain.stamas.entity.ThEtudiantEtu
at org.hibernate.validator.event.ValidateEventListener.validate(ValidateEventListener.java:148)
...
12:23:00,623 DEBUG [Identity] Login failed for: etutest
javax.security.auth.login.LoginException: org.hibernate.validator.InvalidStateException: validation failed for: org.domain.stamas.entity.ThEtudiantEtu
...
12:23:00,628 DEBUG [ResourceLoader] resource bundle missing: login
...
On voit que l'utilisateur est bien authentifié en tant qu'étudiant mais il n'y a pas de trace d'exécution de la requête ni du log qui suis la requête dans le code.
Je ne comprends pas non plus le dernier message à propos du ressource bundle missing.
La requête qui fonctionne sur le serveur SQL est la suivante :
J'ai essayé une createNativeQuery mais ensuite le getSingleResult ne se castait pas dans l'entité ThStageStg alors j'ai essayé de traduire cette requête SQL en createQuery mais ça ne fonctionne pas.
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SELECT ssn.ssn_libelle, ssn.ssn_date_debut, ssn.ssn_date_fin, e.etb_nom, c.cmn_nom, d.dpt_numero FROM th_stage_stg AS stg INNER JOIN te_etablissement_etb AS e ON e.etb_id = stg.stg_id_etablissement INNER JOIN tr_commune_cmn AS c ON c.cmn_id = e.etb_id_commune INNER JOIN tr_departement_dpt AS d ON d.dpt_id = c.cmn_id_departement INNER JOIN te_session_ssn AS ssn ON ssn.ssn_id = stg.stg_id_session INNER JOIN tj_cnd_inscrire_ssn_cis AS cis ON cis.cis_id_session = ssn.ssn_id INNER JOIN th_candidat_cnd AS cnd ON cnd.cnd_id_utilisateur = cis_id_candidat INNER JOIN th_utilisateur_uti AS u ON u.uti_id_personne = cnd.cnd_id_utilisateur WHERE u.uti_login = 'etutest'
Pour comprendre la traduction, il faut savoir que thStageStg hérite de teSessionSsn et que thCandidatSsn hérite de thUtilisateurUti.
![]()
Partager