EmptyResultDataAccessException incorrect result size
Bonjour,
J'utilise le JdbcDaoSupport pour interroger un objet (employe) avec un attribut Login sous forme une adresse e-mail.
J'utilise la méthode queryForObject ...
Cela fonctionne bien quand je fixe l'adresse e-mail du login statiquement dans le code, le résulat peut être trouvé dans la base de données.
Si je fais mon code normal, aucun emplyeur avec l'adresse e-mail spécifiée peut être trouvé, donc je reçois l'exception suivante.
Code:
1 2 3 4 5 6 7 8
| INFOS: Server startup in 3811 ms
2016-06-17 09:30:57 [http-apr-8080-exec-3] DEBUG c.o.s.controleur.HomePageController - showUser() login: test_login@gmail
2016-06-17 09:31:00 [http-apr-8080-exec-3] ERROR c.o.s.dao.JdbcEmployeDaoSupport - getEmployeByLogin , login = test_login@gmail
2016-06-17 09:32:11 [http-apr-8080-exec-3] DEBUG c.o.s.controleur.HomePageController - handleEmptyData()
2016-06-17 09:32:11 [http-apr-8080-exec-3] ERROR c.o.s.controleur.HomePageController - Request: http://localhost:8080/Demo.spring3.mvc.jdbc/emplshowlogin/test_login@gmail.com, error
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
at org.springframework.dao.support.DataAccessUtils.requiredSingleResult(DataAccessUtils.java:71) ~[spring-tx-3.2.2.RELEASE.jar:3.2.2.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:732) ~[spring-jdbc-3.2.2.RELEASE.jar:3.2.2.RELEASE] |
vous remarquez que la méthode retourne l'adresse email sans ".com".
sachant que mon code est comme suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| // show employe by login
@RequestMapping(value = "/emplshowlogin/{login}", method = RequestMethod.GET)
public String showUserbylogin(@PathVariable("login") String login, Model model) {
logger.debug(" showUser() login: {}", login);
Employe empl = employeManager.getEmploye(login);
if (empl == null) {
model.addAttribute("msg", "employe not found");
}
model.addAttribute("empl", empl);
return "show";
} |
et coté DAO :
Code:
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
| public Employe getEmployeByLogin(String login) {
// TODO recuperation d'un employe en fonction de son login
RowMapper mapper = null;
logger.error(" getEmployeByLogin , login = {}", login);
String sql = "select * from employe where login = ?";
//String sql = "select * from employe where login = 'test@gmail.com' and nom = ? "; // Ca Marche bien
try {
// Mapping d'un enregistrement vers un ResultSet
mapper = new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Employe empl = new Employe();
empl.setId(rs.getInt("id"));
empl.setLogin(rs.getString("login"));
//empl.setPassword(rs.getString("password"));
empl.setNom(rs.getString("nom"));
empl.setPrenom(rs.getString("prenom"));
empl.setEmail(rs.getString("email"));
return empl;
} };
} catch (EmptyResultDataAccessException e) {
// do nothing, return null
}
return (Employe) getJdbcTemplate().queryForObject( sql , new Object[] { login }, mapper);
} |
Maintenant, il estime que ce n'est pas la bonne approche, il doit y avoir un moyen plus propre pour gérer URL contenant comme param une valeur sous forme d'un email.
Je n'aime pas l'exception des captures et retourne la méthode null.
Y at-il une autre façon de gérer ce genre de situation?
Merci d'avance.
Cordialement
Mohamed EL BAB