Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

unidades:07_arquitectura:02_excepciones [2012/09/02 18:03]
admin [El código de BussinessException]
unidades:07_arquitectura:02_excepciones [2016/07/03 20:35] (actual)
Línea 1: Línea 1:
 ====== Excepciones ====== ====== Excepciones ======
-Nuestro siguiente tema a tratar con la arquitectura de Hibernate es el tratamiento de las excepciones. +Nuestro siguiente tema a tratar con la arquitectura de Hibernate es el tratamiento de las excepciones.Antes de ver este tema es recomendable la lectura de [[patrones:excepciones]].
 ===== Tratamiento de Excepciones ===== ===== Tratamiento de Excepciones =====
 Al realizar una operación con Hibernate se pueden lanzar cualquiera de las siguiente 4 excepciones: Al realizar una operación con Hibernate se pueden lanzar cualquiera de las siguiente 4 excepciones:
Línea 23: Línea 22:
         }         }
     } catch (Exception exc) {     } catch (Exception exc) {
-        log.error("Falló al hacer un rollback", exc);+        LOGGER.log(Level.WARNING,"Falló al hacer un rollback", exc);
     }     }
     throw new BussinessException(cve);                 throw new BussinessException(cve);            
Línea 32: Línea 31:
         }         }
     } catch (Exception exc) {     } catch (Exception exc) {
-        log.error("Falló al hacer un rollback", exc);+        LOGGER.log(Level.WARNING,"Falló al hacer un rollback", exc);
     }     }
     throw new BussinessException(cve);     throw new BussinessException(cve);
Línea 41: Línea 40:
         }         }
     } catch (Exception exc) {     } catch (Exception exc) {
-        log.error("Falló al hacer un rollback", exc);+        LOGGER.log(Level.WARNING,"Falló al hacer un rollback", exc);
     }     }
     throw ex;                    throw ex;               
Línea 50: Línea 49:
         }         }
     } catch (Exception exc) {     } catch (Exception exc) {
-        log.error("Falló al hacer un rollback", exc);+        LOGGER.log(Level.WARNING,"Falló al hacer un rollback", exc);
     }     }
     throw ex;     throw ex;
Línea 59: Línea 58:
         }         }
     } catch (Exception exc) {     } catch (Exception exc) {
-        log.error("Falló al hacer un rollback", exc);+        LOGGER.log(Level.WARNING,"Falló al hacer un rollback", exc);
     }     }
     throw new RuntimeException(ex);     throw new RuntimeException(ex);
Línea 73: Línea 72:
     }     }
 } catch (Exception exc) { } catch (Exception exc) {
-    log.error("Falló al hacer un rollback", exc);+    LOGGER.log(Level.WARNING,"Falló al hacer un rollback", exc);
 } }
 </code> </code>
  
-La propiedad ''log'' la definiremos como una propiedad a nivel de clase usando [[http://commons.apache.org/logging/|Apache Common Loggin]] de la siguiente forma:+La propiedad estática ''LOGGER'' la definiremos como una propiedad a nivel de clase usando [[http://docs.oracle.com/javase/6/docs/technotes/guides/logging/|Java Logging APIs]] de la siguiente forma:
 <code java> <code java>
-protected final Log log LogFactory.getLog(getClass());+private final static Logger LOGGER Logger.getLogger(ProfesorController.class .getName());
 </code> </code>
  
 Veamos ahora el tratamiento individualizado para cada una de ellas: Veamos ahora el tratamiento individualizado para cada una de ellas:
- 
 ==== RuntimeException ==== ==== RuntimeException ====
 Si la excepción es de tipo ''RuntimeException'' lo único que hacemos es volver a relanzar la misma excepción mediante: Si la excepción es de tipo ''RuntimeException'' lo único que hacemos es volver a relanzar la misma excepción mediante:
Línea 96: Línea 94:
 </code> </code>
  
-De esa forma evitamos la obligación de tratar las Checked Exceptions de Java+De esa forma evitamos la obligación de tratar las Checked Exceptions de Java cuando no sabemos que hacer con ella.
- +
-<note tip> +
-En la comunidad Java siempre hay un gran debate al respecto de las Checked Exceptions vs Unchecked Exceptions. +
- +
-Mi opinión personal es que sólo aquellas excepciones de las que nos podemos recuperar deberían ser Checked Exceptions. El resto deberían ser Unchecked Exceptions.  +
- +
-Por degracia en muchas clases del JDK se han usado Checked Exceptions para errores en los que era poco probable que pudieramos solucionar algo. Un ejemplo de ello es el API de JDBC , en el que la mayoría de métodos lanzaban la Checked Exception <javadoc jdk7>java.sql.SQLException</javadoc>. +
- +
-Por otro lado Hibernate eligió la opción opuesta y lanza Unchecked Exception mediante <javadoc h41>org.hibernate.HibernateException</javadoc>. +
-</note>+
  
 ==== javax.validation.ConstraintViolationException ==== ==== javax.validation.ConstraintViolationException ====
Línea 121: Línea 109:
  
 ==== BussinessException  ==== ==== BussinessException  ====
-Si se produce ésta excepción simplemente la volveremos a relanzar sin modificar nada ya que queremos que se //vea// ta y como es. +Si se produce ésta excepción simplemente la volveremos a relanzar sin modificar nada ya que queremos que se //vea// tal y como es. 
 <code java> <code java>
 throw ex; throw ex;
Línea 165: Línea 153:
 <uml> <uml>
 class BussinessException class BussinessException
 +BussinessException : Set<BussinessMessage> getBussinessMessages()
 +
 class BussinessMessage class BussinessMessage
  
Línea 173: Línea 163:
  
 class ConstraintViolationException class ConstraintViolationException
 +ConstraintViolationException : Set<ConstraintViolation> getConstraintViolations() 
 +
 class ConstraintViolation class ConstraintViolation
  
Línea 212: Línea 204:
 public class BussinessException extends Exception { public class BussinessException extends Exception {
  
-    private List<BussinessMessage> bussinessMessages = new ArrayList<>();+    private Set<BussinessMessage> bussinessMessages = new TreeSet<>();
  
     public BussinessException(List<BussinessMessage> bussinessMessages) {     public BussinessException(List<BussinessMessage> bussinessMessages) {
Línea 231: Línea 223:
             String message;             String message;
  
-            fieldName=constraintViolation.getPropertyPath().toString(); +            fieldName = getCaptions(constraintViolation.getRootBeanClass(), constraintViolation.getPropertyPath()); 
-            message=constraintViolation.getMessage();+            message = constraintViolation.getMessage();
  
             bussinessMessages.add(new BussinessMessage(fieldName, message));             bussinessMessages.add(new BussinessMessage(fieldName, message));
Línea 242: Línea 234:
     }     }
  
-    public List<BussinessMessage> getBussinessMessages() {+    public Set<BussinessMessage> getBussinessMessages() {
         return bussinessMessages;         return bussinessMessages;
     }     }
Línea 249: Línea 241:
  
 Podemos ver que el código es bastante sencillo. Consta principalmente de varios constructores y el método ''getBussinessMessages()''. Podemos ver que el código es bastante sencillo. Consta principalmente de varios constructores y el método ''getBussinessMessages()''.
-  * Línea 3: Array donde guardar todos los ''BussinessMessage''.+  * Línea 3: Un <javadoc>java.util.TreeSet</javadoc> donde guardar todos los ''BussinessMessage''. Se usa un <javadoc>java.util.TreeSet|TreeSet</javadoc> para que los mensajes salgan ordenados por orden alfabético.
   * Líneas 5-7: Constructor al que directamente se le pasa una lista de ''BussinessMessage''.Ësto permitirá generar mensajes al usuario aunque no haya habido ninguna excepción.   * Líneas 5-7: Constructor al que directamente se le pasa una lista de ''BussinessMessage''.Ësto permitirá generar mensajes al usuario aunque no haya habido ninguna excepción.
   * Líneas 9-11: Constructor al que directamente se le pasa un único ''BussinessMessage''.Esto permitirá generar mensajes al usuario aunque no haya habido ninguna excepción.   * Líneas 9-11: Constructor al que directamente se le pasa un único ''BussinessMessage''.Esto permitirá generar mensajes al usuario aunque no haya habido ninguna excepción.
Línea 259: Línea 251:
 El código de ''BussinessMessage'' es el siguiente: El código de ''BussinessMessage'' es el siguiente:
 <code java 1 | BussinessMessage.java> <code java 1 | BussinessMessage.java>
-public class BussinessMessage { +public class BussinessMessage implements Comparable<BussinessMessage> 
-    private String fieldName; +    private final String fieldName; 
-    private String message;+    private final String message;
  
     public BussinessMessage(String fieldName, String message) {     public BussinessMessage(String fieldName, String message) {
 +        if (message==null) {
 +            throw new IllegalArgumentException("message no puede ser null");
 +        }
 +        
         if ((fieldName!=null) && (fieldName.trim().equals(""))) {         if ((fieldName!=null) && (fieldName.trim().equals(""))) {
             this.fieldName =null;             this.fieldName =null;
Línea 281: Línea 277:
     }     }
          
 +    /** 
 +     * @return the fieldName 
 +     */
     public String getFieldName() {     public String getFieldName() {
         return fieldName;         return fieldName;
     }     }
  
 +    /** 
 +     * @return the message 
 +     */
     public String getMessage() {     public String getMessage() {
         return message;         return message;
     }     }
 +
 +
 +    @Override
 +    public int compareTo(BussinessMessage o) {
 +        if ((getFieldName()==null) && (o.getFieldName()==null)) {
 +            return getMessage().compareTo(o.getMessage());
 +        } else if ((getFieldName()==null) && (o.getFieldName()!=null)) {
 +            return 1;
 +        } else if ((getFieldName()!=null) && (o.getFieldName()==null)) {
 +            return -1;
 +        } else if ((getFieldName()!=null) && (o.getFieldName()!=null)) {
 +            if (getFieldName().equals(o.getFieldName())) {
 +                return getMessage().compareTo(o.getMessage());
 +            } else {
 +                return getFieldName().compareTo(o.getFieldName());
 +            }
 +        } else {
 +           throw new RuntimeException("Error de lógica"); 
 +        } 
 +    }
 +
 +    
 } }
 </code> </code>
  
-La clase ''BussinessMessage'' es más sencilla aúnDestacar las líneas 9 y 11, en las que se pone en mayúsculas el primer carácter del campo y el mensaje.+La clase ''BussinessMessage'' es también sencilla pero tiene la particularidad de implementar el interfaz <javadoc>java.lang.Comparable</javadoc>. 
 +  * Línea 1: Implementar el interfaz <javadoc>java.lang.Comparable|Comparable</javadoc>. Se implementa este interfaz para que se pueda usar dentro de la clase <javadoc>java.util.TreeSet</javadoc> y que los mensajes salga ordenados. 
 +  * Líneas 13 y 15 : Se pone en mayúsculas el primer carácter del campo y el mensaje para que quede mas amigable al usuario. 
 +  * Línea de la 43 a la 59: Método <javadoc>java.lang.Comparable#compareTo(T)|compareTo(T)</javadoc> del interfaz <javadoc>java.lang.Comparable|Comparable</javadoc>. Este método ordena las ''BussinessMessage'' de forma que primero van los mensajes que incluyen el nombre del campo y luego los que no.
 ===== Nombres de las columnas ===== ===== Nombres de las columnas =====
 La última parte que nos queda por tratar es el tema del nombre de las columnas. En el texto que muestra ''BussinessMessage'' se sigue viendo como nombre de una columna el nombre de la propiedad Java. Ya hemos explicado que esto debería ser solucionado. La última parte que nos queda por tratar es el tema del nombre de las columnas. En el texto que muestra ''BussinessMessage'' se sigue viendo como nombre de una columna el nombre de la propiedad Java. Ya hemos explicado que esto debería ser solucionado.
Línea 465: Línea 490:
 fieldName=getCaptions(constraintViolation.getRootBeanClass(), constraintViolation.getPropertyPath()); fieldName=getCaptions(constraintViolation.getRootBeanClass(), constraintViolation.getPropertyPath());
 </code> </code>
 +
 +<note>
 +Para la realización de éste código se han usado las clases <javadoc s31>org.springframework.util.ReflectionUtils</javadoc> y <javadoc s31>org.springframework.util.StringUtils</javadoc> del framework Spring. Estas clases son simple clases de utilidad con funciones sencillas. Para poder usarlas se ha incluido el jar ''org.springframework.core-3.1.2.RELEASE.jar''. En la siguiente sesión trataremos en profundidad el framework de Spring y explicaremos como instalarlo adecuadamente.Por ahora simplemente recordar el incluir el jar ''org.springframework.core-3.1.2.RELEASE.jar'' en los ejercicios que se realicen.
 +</note>
unidades/07_arquitectura/02_excepciones.1346601807.txt.gz · Última modificación: 2016/07/03 20:37 (editor externo)
Ir hasta arriba
CC Attribution-Noncommercial-Share Alike 3.0 Unported
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0