Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Java (http://www.forosdelweb.com/f45/)
-   -   problema al mostrar errores (http://www.forosdelweb.com/f45/problema-mostrar-errores-463902/)

yeyocp 10/02/2007 05:13

problema al mostrar errores
 
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());
}
}

GreenEyed 10/02/2007 08:20

Re: problema al mostrar errores
 
Código:

if(cliente.getNif().trim().equals(""))
esta linea* te dara un NullPointer exception si cliente o getNif devuelve null, asi que supongo que esos son los errores que te da y por eso te escribe "null" (es el mensaje que sale en algunas excepciones al dar una NPE)

S!

PD: * Esta y todas las lineas parecidas

yeyocp 11/02/2007 04:24

Re: problema al mostrar errores
 
pues no parece que sea ese el problema, en la ventana de tomcat si que me aparace el error.missing.* y no veo por ningun lado ningún NPE. También he probado a poner "".equals(cliente.getNif().trim()) pero ocurre lo mismo.

GreenEyed 11/02/2007 05:22

Re: problema al mostrar errores
 
si pones
Código:

cliente.getNif().trim())
te seguira dando NPE ya que si getNif() devuelve null, al aplicarle el trim() da una NPE.

Si necesitas hacer el trim(), prueba con

Código:

cliente.getNif()!=null && "".equals(cliente.getNif().trim())
De todas formas, tambien añadele e.printStacktrace() en los catch, para que te salga exactamente donde se produce el error.

S!

yeyocp 11/02/2007 05:27

Re: problema al mostrar errores
 
no se si el problema puede estar en el archivo de recursos ConcesionarioResources.properties, he intentado comprobar errores antes de hacer ningun acceso a la base de datos con ActionError y ActionErrors pero me sigue apareciendo el doble null, o ya no se si pensar como tu dices GreenEyed porque ya no se que otra cosa puede ser. He hecho:

ActionErrors errors = new ActionErrors();
Cliente cliente = new Cliente();

cliente = (Cliente)form;

String nif = cliente.getNif();

if(nif.trim().equals(""))
{
ActionError error = new ActionError("error.missing.nif");
errors.add(ActionErrors.GLOBAL_ERROR, error);
}

if(errors.size() >0)
{
saveErrors(request, errors);
return new ActionForward(mapping.getInput());
}

yeyocp 11/02/2007 05:29

Re: problema al mostrar errores
 
Cita:

Iniciado por GreenEyed (Mensaje 1888969)
si pones
Código:

cliente.getNif().trim())
te seguira dando NPE ya que si getNif() devuelve null, al aplicarle el trim() da una NPE.

Si necesitas hacer el trim(), prueba con

Código:

cliente.getNif()!=null && "".equals(cliente.getNif().trim())
De todas formas, tambien añadele e.printStacktrace() en los catch, para que te salga exactamente donde se produce el error.

S!


Lo voy a probar, es que justo estaba escribiendo otro post cuando me has mandado este. Luego te cuento.

yeyocp 11/02/2007 05:43

Re: problema al mostrar errores
 
Sigue igual, ya me estoy empezando a desesperar, parece que todo lo hace bien, detecta que falta el campo que sea pero luego no me imprime el error. Gracias por las sugerencias de todos modos.

yeyocp 11/02/2007 05:50

Re: problema al mostrar errores
 
pongo la traza de errores de tomcat por si sirve de algo (espero que se pueda acceder a la imagen), en este caso es para vehiculo y marca pero es todo igual que para cliente y nif

http://img267.imageshack.us/img267/6098/dibujokt1.jpg

GreenEyed 11/02/2007 06:08

Re: problema al mostrar errores
 
¿Que pone en la linea 169 de VehiculoBO.java?

yeyocp 11/02/2007 06:10

Re: problema al mostrar errores
 
if(vehiculo.getMarca()!=null && "".equals(vehiculo.getMarca().trim()))
{
---------> throw new VehiculoException("error.missing.marca");
}

GreenEyed 11/02/2007 06:16

Re: problema al mostrar errores
 
Entonces, hace lo que toca, inicialmente, ya que detecta que le falta la marca y ya no da NullPointerException. ¿Que es lo que crees que deberia hacer despues?

Si es que no redirecciona el error el Struts, ahi no te puedo ayudar mucho por que no use el Struts :-).

S!

yeyocp 11/02/2007 06:23

Re: problema al mostrar errores
 
se supone que una vez creada la excepcion de que falta la marca en la clase de accion recogería ese errror y lo añadiría al ActionErrors errors como pone a continuación:

catch (Throwable e)
{
ActionErrors errors = new ActionErrors();
e.printStackTrace();
ActionError error = new ActionError(e.getMessage());
errors.add(ActionErrors.GLOBAL_ERROR, error);
}

saveErrors(request, errors);
return new ActionForward(mapping.getInput());

yeyocp 11/02/2007 06:54

Re: problema al mostrar errores
 
he puesto en el archivo de recuros (ConcesionarioResources.properties) esto

error.missing.marca=<li><font color="red">Por favor, introduce la marca</font></li>

lo he visto en un ejemplo de un libro (aunque no se que significan los <li>, lo miraré) y sale bien el error de que falta la marca, aunque aparece entre los dos null de antes, esos si que no se de donde provienen

yeyocp 11/02/2007 07:04

Re: problema al mostrar errores
 
ya se que es ese <li> eso no tiene que ver. en ConcesionarioResource.properties tenia

error.missing.nif=
<font color="red"> Introduzca el NIF </font>

si pongo

error.missing.nif=<font color="red"> Introduzca el NIF </font>

Sale el error asi: null Introduzca el NIF null

Ya intentaré averiguar de donde salen esos null

Perdón por tanta molestia y gracias de nuevo por tu ayuda GreenEyed, espero yo también poder ayudar a los demás cuando vaya cogiendo más experiencia. Un saludo.

GreenEyed 11/02/2007 07:06

Re: problema al mostrar errores
 
Ummmm

Si lo hicieras asi no funcionaria, ya que cuando haces " saveErrors(request, errors);" la variable errors a la que les ha añadido el error esta fuera de ambito (esta declarada dentro del catch), no creo que sea eso por que si no te daria error de compilacion.

Pero prueba a poner algunos system err en antes del saveErrors a ver si el error esta añadido etc.

Lo que hace de hacer despues, ya... es cosa de Struts.


La zona horaria es GMT -6. Ahora son las 08:20.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.