Hola a todos. Tengo una aplicación basada en Struts y me surgen problemas a la hora de mostrar los errores en la propia página. Por ejemplo, cuando quiero dar de alta un cliente y faltan alguno de los datos, como el nombre o los apellidos. Lo tengo hecho así:
Tengo la clase de negocio del cliente, en la que hay una funciona 'validarCliente' a la que se le pasa un objeto Cliente, que será el que posteriormente se le pasará a otra clase de acceso a datos para que cree el nuevo cliente en la base de datos.
private void validarCliente(Cliente cliente) throws ClienteException
{
if(cliente.getNif().trim().equals(""))
{
throw new ClienteException("error.missing.nif");
}
if(cliente.getNombre().trim().equals(""))
{
throw new ClienteException("error.missing.nombre");
}
if(cliente.getApellido1().trim().equals(""))
{
throw new ClienteException("error.missing.apellido1");
}
if(cliente.getApellido2().trim().equals(""))
{
throw new ClienteException("error.missing.apellido2");
}
}
Tengo definida la excepcion ClienteException a la que se le pasa el correspondiente mensaje de error de la siguiente manera:
package concesionario.negocio;
public class ClienteException extends Exception
{
public ClienteException(String message)
{
super(message);
}
}
Tengo también un archivo de recursos de la aplicación (ConcesionarioResources.Properties) en el que defino un mensaje asociado a cada error:
error.create.cliente=
<font color="red"> No se puede crear el cliente </font>
error.removed.cliente=
<font color="red"> El cliente seleccionado se ha eliminado </font>
error.duplicate.cliente=
<font color="red"> El cliente especificado ya existe </font>
error.missing.nif=
<font color="red"> Introduzca el NIF </font>
error.missing.nombre=
<font color="red"> Introduzca el nombre </font>
error.missing.apellido1=
<font color="red"> Introduzca el primer apellido </font>
error.missing.apellido2=
<font color="red"> Introduzca el segundo apellido </font>
Y este archivo esta definido en el web.xml como parámetro de inicio del servlete de acción:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>application</param-name>
<param-value>ConcesionarioResources</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
Pues bien, después de todo esto, si por ejemplo dejo sin introducir alguno de los datos del cliente, no me aparece el error correspondiente en la página, simplemente me aparecen dos 'null'. Le he dado mil vueltas y no se que puede estar mal o si se puede hacer mejor de otra forma.
Añadir por si sirve de ayuda que la funcion de la clase de negocio para registrar el cliente es:
public void registrarCliente(Cliente cliente) throws ClienteException
{
validarCliente(cliente);
Connection con = null;
try
{
con = pool.getConnection();
ClienteDAO clienteDAO = new ClienteDAO(con);
clienteDAO.crear(cliente);
con.commit(); /* Se realiza la transaccion */
}
catch(Exception e)
{
try
{
if(con != null)
{
con.rollback();
throw new ClienteException(e.getMessage());
}
}
catch(SQLException sqle)
{
e.printStackTrace();
throw new RuntimeException("error.unexpected");
}
}
finally
{
try
{
if(con != null)
{
con.close();
}
}
catch(SQLException sqle)
{
sqle.printStackTrace();
throw new RuntimeException("error.unexpected");
}
}
}
Y que el código de la clase de acción es:
package concesionario.actions;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import concesionario.negocio.ClienteBO;
import concesionario.entidades.Cliente;
public class RegistrarClienteAction extends Action
{
public ActionForward perform(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
ActionErrors errors = new ActionErrors();
try
{
ClienteBO clienteBO = new ClienteBO();
clienteBO.registrarCliente((Cliente)form);
return mapping.findForward("success");
}
catch (Throwable e)
{
e.printStackTrace();
ActionError error = new ActionError(e.getMessage());
errors.add(ActionErrors.GLOBAL_ERROR, error);
}
saveErrors(request, errors);
return new ActionForward(mapping.getInput());
}
}