Blogues

Gérer les erreurs dans le JSP

Ou comment enfin éviter d'avoir cette fameuse en rouge

Liferay vous propose d'utiliser le taglib liferay-ui:error pour afficher proprement les erreurs dans votre page JSP (voir https://docs.liferay.com/portal/6.2/taglibs/index.html)

<liferay-ui:error key="user-not-found" message="user-not-found"/>

Evidemment, le message "user-not-found" doit être généré en amont au niveau du portlet.

try{

myObject.doSomething(...);

} catch ( NoSuchUserException e){

SessionErrors.add(actionRequest, "user-not-found");

}

Jusque là, tout parait simple. Mais dès lors que votre méthode peut remonter une dizaine d'erreur (ou même 5 d'ailleurs!) alors, vous vous retrouvez à faire d'une part 5 à 10 catch pour générer 5 à 10 message d'erreur. Et comme le taglib vous demande (cerise sur le gâteau) de mentionner la clé (attribut "key") et le message (attribut "message"), vous vous retrouvez à écrire 4 fois le même identifiant d'erreur:

  1. la première fois dans le portlet pour remonter l'erreur
  2. la deuxième fois dans "key" du taglib
  3. la troisième fois dans "message" du taglib
  4. la quatrième fois dans le fichier Language.properties pour la localisation du message

En alternative, j'ai opté pour une autre solution

try{

myObject.doSomething(...);

} catch ( NoSuchUserException e){

SessionErrors.add(actionRequest, e.class);

}

A la place de mentionner le message, je mentionne la classe. Et au niveau du JSP, je définis une petite routine pour traiter les messages d'erreur automatiquement

<%@page import="com.liferay.portal.kernel.language.LanguageUtil"%>
<%@page import="com.liferay.portal.kernel.util.CamelCaseUtil"%>
<%@page import="com.liferay.portal.kernel.util.Validator"%>
<%@page import="com.liferay.portal.kernel.util.StringUtil"%>
<%@page import="com.liferay.portal.kernel.servlet.SessionErrors"%>
<%@page import="java.util.Iterator"%>
<%
Iterator iterator = SessionErrors.iterator(renderRequest);
while (iterator.hasNext()){
String errorKey = (String)iterator.next();
String className = StringUtil.extractLast(errorKey, ".");
if (Validator.isNotNull(className)){
errorKey = CamelCaseUtil.fromCamelCase(className).toLowerCase();
}
%>
<div class="alert alert-error"><%=LanguageUtil.get(pageContext,errorKey) %></div>
<%
}
%>
 
Evidemment, cette routine est dans un fichier errors.jsp qui est appellé via un include dans le JSP qui a besoin de traiter les erreurs. Résultat, pour chaque erreur, je dois définir un type d'exception (certains verront ça comme une contrainte) et la clé correspondante dans Language.properties. Exemple: l'exception NoSuchUserException nécessite la clé no-such-user-exception
00

Plus d'entrées de blog

thumbnail
thumbnail

Ajouter des commentaires

Blogueurs récents

Eric COQUELIN
Publications: 5
Nombre d'évaluations: 0
Données: 18/12/18
Omar HARRARI
Publications: 1
Nombre d'évaluations: 0
Données: 10/12/18
Kamal DOUKALI
Publications: 1
Nombre d'évaluations: 0
Données: 29/05/18