Foros del Web » Programación para mayores de 30 ;) » Java »

problema al mostrar errores

Estas en el tema de problema al mostrar errores en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 10/02/2007, 05:13
 
Fecha de Ingreso: octubre-2006
Mensajes: 50
Antigüedad: 17 años, 6 meses
Puntos: 0
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());
}
}

Última edición por yeyocp; 10/02/2007 a las 05:21
  #2 (permalink)  
Antiguo 10/02/2007, 08:20
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
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
  #3 (permalink)  
Antiguo 11/02/2007, 04:24
 
Fecha de Ingreso: octubre-2006
Mensajes: 50
Antigüedad: 17 años, 6 meses
Puntos: 0
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.
  #4 (permalink)  
Antiguo 11/02/2007, 05:22
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
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!
  #5 (permalink)  
Antiguo 11/02/2007, 05:27
 
Fecha de Ingreso: octubre-2006
Mensajes: 50
Antigüedad: 17 años, 6 meses
Puntos: 0
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());
}
  #6 (permalink)  
Antiguo 11/02/2007, 05:29
 
Fecha de Ingreso: octubre-2006
Mensajes: 50
Antigüedad: 17 años, 6 meses
Puntos: 0
Re: problema al mostrar errores

Cita:
Iniciado por GreenEyed Ver Mensaje
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.
  #7 (permalink)  
Antiguo 11/02/2007, 05:43
 
Fecha de Ingreso: octubre-2006
Mensajes: 50
Antigüedad: 17 años, 6 meses
Puntos: 0
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.
  #8 (permalink)  
Antiguo 11/02/2007, 05:50
 
Fecha de Ingreso: octubre-2006
Mensajes: 50
Antigüedad: 17 años, 6 meses
Puntos: 0
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

  #9 (permalink)  
Antiguo 11/02/2007, 06:08
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: problema al mostrar errores

¿Que pone en la linea 169 de VehiculoBO.java?
  #10 (permalink)  
Antiguo 11/02/2007, 06:10
 
Fecha de Ingreso: octubre-2006
Mensajes: 50
Antigüedad: 17 años, 6 meses
Puntos: 0
Re: problema al mostrar errores

if(vehiculo.getMarca()!=null && "".equals(vehiculo.getMarca().trim()))
{
---------> throw new VehiculoException("error.missing.marca");
}
  #11 (permalink)  
Antiguo 11/02/2007, 06:16
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
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!
  #12 (permalink)  
Antiguo 11/02/2007, 06:23
 
Fecha de Ingreso: octubre-2006
Mensajes: 50
Antigüedad: 17 años, 6 meses
Puntos: 0
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());
  #13 (permalink)  
Antiguo 11/02/2007, 06:54
 
Fecha de Ingreso: octubre-2006
Mensajes: 50
Antigüedad: 17 años, 6 meses
Puntos: 0
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
  #14 (permalink)  
Antiguo 11/02/2007, 07:04
 
Fecha de Ingreso: octubre-2006
Mensajes: 50
Antigüedad: 17 años, 6 meses
Puntos: 0
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.
  #15 (permalink)  
Antiguo 11/02/2007, 07:06
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
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.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:09.