Hi, I have developed two utility classes to store my actionMessages in a ThreadLocal variabele
//----- Code of my ErrorUtil class, I have the simular class for my ActionMessages -------- package org.easy.framework.util; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; public class ErrorUtil { private static final ThreadLocal<ActionErrors> actionErrors = new ThreadLocal<ActionErrors>(); public static ActionErrors currentErrors(){ ActionErrors errors = actionErrors.get(); if(errors == null){ System.out.println("new ActionErrors"); errors = new ActionErrors(); actionErrors.set(errors); } return errors; } public static void addError(ActionMessage message){ currentErrors().add(ActionMessages.GLOBAL_MESSAGE, message); } public static void addError(String msg, ActionMessage message){ currentErrors().add(msg, message); } public static boolean isEmpty(){ ActionErrors errors = actionErrors.get(); if(errors == null){ return true; } return false; } public static void clear(){ actionErrors.set(null); } } //---- A piece of code of my inhereted DispatchMethod ----- /** If there are errors or messages found, add them to the request **/ protected ActionForward dispatchMethod(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, String name) throws Exception { try{ ActionForward actionForward = super.dispatchMethod (mapping,form,request,response,name); // Return the returned ActionForward instance return actionForward; }catch(ValidationException e){ return mapping.findForward(Constants.INPUT); }finally{ //Add the actionMessages to the request if(!MessageUtil.isEmpty()){ ActionMessages messages = new ActionMessages( MessageUtil.currentMessages()); saveMessages(request, messages); MessageUtil.clear(); } //Add the actionErrors to the request if(!ErrorUtil.isEmpty()){ ActionMessages messages = new ActionMessages(ErrorUtil.currentErrors ()); saveErrors(request, messages); ErrorUtil.clear(); } //Close the session, if session is open HibernateUtil.closeSession(); } } //--- An example how I use my actionMessage in my bussiness logic //-------------------------------------------------------------------------------- validate method private static void validate(Service service, String method) throws ValidationException{ if(HomeUtil.UPDATE.equals(method)){ //ID constraint if(service.getId() == 0){ ErrorUtil.addError("id",new ActionMessage("service.error.id.required")); } } if(HomeUtil.CREATE.equals(method) || HomeUtil.UPDATE.equals(method)){ //code constraint if(service.getCode() == null || "".equals(service.getCode())){ ErrorUtil.addError("code",new ActionMessage("service.error.code.required ")); }else{ if(service.getCode().length() > 10) ErrorUtil.addError("code",new ActionMessage("service.error.code.tolong ",10)); else if(!ServiceHome.checkUniqueCode(service)) ErrorUtil.addError("code",new ActionMessage(" service.error.code.notunique",service.getCode())); else service.setCode(service.getCode().toUpperCase()); } //name constraint if(service.getName() == null || "".equals(service.getName())){ ErrorUtil.addError("name",new ActionMessage("service.error.name.required ")); }else{ if(service.getName().length() > 40) ErrorUtil.addError("name",new ActionMessage("service.error.name.tolong ",40)); } //Description constraint if(service.getDescription().length() > 250) ErrorUtil.addError("description",new ActionMessage(" service.error.description.tolong",250)); } //throw errors if any if(!ErrorUtil.isEmpty()){ throw new ValidationException(); } } Good luck!! Pieter Pareit