Poco a poco con Maven, Spring, Hibernate (parte 3)

Ya no queda nada para tener una aplicación como esta. Con ella podremos administrar nuestros contactos de forma simple y fácil. Además estamos aprendiendo muchísimo(o al menos yo) sobre Spring MVC, Hibernate y Maven.  Aunque todavía nos queda mucho por aprender.

Ya hemos visto como crear el proyecto y cómo configurarlo para que con unas pocas clases tener una aplicación CRUD que gestiona nuestra agenda.

Para terminar el proyecto solo nos queda crear las clases e interfaces, para no perdernos vuelvo a  poner la imagen del árbol de archivos para que no nos perdamos creando clases.

En primer lugar vamos a crear la clase Contact, que es una simple clase POJO que se usará para hacer a Hibernate interactuar con la BD. Esta clase será una entidad que se vinculará  con la tabla Contacts que creamos en un post anterior.

/demoweb-hibernate/src/main/java/com/jesuslc/contact/form/Contact.java

package com.jesuslc.contact.form;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="CONTACTS")
public class Contact {

 @Id
 @Column(name="ID")
 @GeneratedValue
 private Integer id;

 @Column(name="FIRSTNAME")
 private String firstname;

 @Column(name="LASTNAME")
 private String lastname;

 @Column(name="EMAIL")
 private String email;

 @Column(name="TELEPHONE")
 private String telephone;

 public String getEmail() {
 return email;
 }
 public String getTelephone() {
 return telephone;
 }
 public void setEmail(String email) {
 this.email = email;
 }
 public void setTelephone(String telephone) {
 this.telephone = telephone;
 }
 public String getFirstname() {
 return firstname;
 }
 public String getLastname() {
 return lastname;
 }
 public void setFirstname(String firstname) {
 this.firstname = firstname;
 }
 public void setLastname(String lastname) {
 this.lastname = lastname;
 }
 public Integer getId() {
 return id;
 }
 public void setId(Integer id) {
 this.id = id;
 }
}
  • @Entity le decimos a Hibernate que esta clase representa un objeto persistente.
  • @Table(name=”CONTACTS”) le dice que la tabla que tiene que utilizar para mapear los objetos de esta clase es CONTACTS.
  • @Id es una notación que indica que la variable Id es la clave primaia de la tabla
  • @GeneratedValude indica que el valor se lo dará la BD y no se hará en el código, es decir será un valor autogenerado.
  • @Column (name=”nombre”)  es una notación que se utiliza para asignar la propiedad a la columna de la base de datos.

Llegados a este punto tenemos mapeada la base de datos, nuestra base de datos es pequeña (solo una tabla) pero si tuviésemos más solo tendríamos que realizar unas cuantas clases más.

Así que ahora conviene que recordemos la arquitectura de nuestra aplicación para que a la hora de ir creando nuevas clases no perdamos el norte.

Capa de acceso a datos (DAO)

La capa DAO es la que se encarga de manejar los datos directamente, esta capa consta de una interfaz y de la clase que implementa dicha interfaz.

La interfaz ContactDAO indica las acciones que podemos realizar con los datos, en nuestro caso Contactos. Por tanto nosotros podemos Añadir contactos (AddContact), Borrar contactos (DeleteContact) y listar los contactos que tenemos guardados en la BD (listContact)

Aquí tenemos la Interfaz:

/demoweb-hibernate/src/main/java/com/jesuslc/contact/dao/ContactDAO.java

package com.jesuslc.contact.dao;
import com.jesuslc.contact.form.Contact;
import java.util.List;
public interface ContactDAO {
public void addContact(Contact contact);
 public List<Contact> listContact();
 public void removeContact(Integer id);
}

La clase ContactAOImpl implementa la interfaz ContactDAO. Debemos tener en cuenta que vamos a utilizar las notaciones de Spring @Repository @Autowired por eso tenemos que estar atentos en las importaciones.

/demoweb-hibernate/src/main/java/com/jesuslc/contact/dao/ContactDAOImpl.java

package com.jesuslc.contact.dao;
import java.util.List;
import com.jesuslc.contact.form.Contact;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class ContactDAOImpl implements ContactDAO {
@Autowired
 private SessionFactory sessionFactory;
public void addContact(Contact contact) {
 sessionFactory.getCurrentSession().save(contact);
 }
public List<Contact> listContact() {
return sessionFactory.getCurrentSession().createQuery("from Contact")
 .list();
 }
public void removeContact(Integer id) {
 Contact contact = (Contact) sessionFactory.getCurrentSession().load(
 Contact.class, id);
 if (null != contact) {
 sessionFactory.getCurrentSession().delete(contact);
 }
}
}

Al utilizar estas anotaciones le indicamos a Spring que esta clase es especial y Spring debe interactuar con ella. Al tener tan separadas cada una de las clases eliminamos el acoplamiento y por ello nos “olvidamos” de la base de datos en las capas superiores.

Capa de Servicio

En nuestro caso la capa de servicios es similar a la capa DAO. En la capa de servicio “se implementan las reglas de negocio” en nuestro caso la aplicación de gestión de contactos es básica y no tiene ninguna regla de negocio.

Aquí tenemos la interfaz:

/demoweb-hibernate/src/main/java/com/jesuslc/contact/service/ContactService.java

package com.jesuslc.contact.service;
import java.util.List;
import com.jesuslc.contact.form.Contact;
public interface ContactService {

 public void addContact(Contact contact);
 public List<Contact> listContact();
 public void removeContact(Integer id);
}

En este caso para indicar a Spring que esta es la copa de servicios hemos utilizado la notación @Service

/demoweb-hibernate/src/main/java/com/jesuslc/contact/service/ContactServiceImpl.java

package com.jesuslc.contact.service;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jesuslc.contact.dao.ContactDAO;
import com.jesuslc.contact.form.Contact;
@Service
public class ContactServiceImpl implements ContactService {

 @Autowired
 private ContactDAO contactDAO;

 @Transactional
 public void addContact(Contact contact) {
 contactDAO.addContact(contact);
 }

 @Transactional
 public List<Contact> listContact() {

 return contactDAO.listContact();
 }

 @Transactional
 public void removeContact(Integer id) {
 contactDAO.removeContact(id);
 }
}

Añadiendo el Controlador al modelo MVC

Ya tenemos casi terminada nuesrta aplicación. Solo tenemos que añadir la clase Controlador a nuestro proyecto.

/demoweb-hibernate/src/main/java/com/jesuslc/contact/controller/ContactController.java

package com.jesuslc.contact.controller;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.jesuslc.contact.form.Contact;
import com.jesuslc.contact.service.ContactService;
@Controller
public class ContactController {
@Autowired
 private ContactService contactService;
@RequestMapping("/index")
 public String listContacts(Map<String, Object> map) {
map.put("contact", new Contact());
 map.put("contactList", contactService.listContact());
return "contact";
 }
@RequestMapping(value = "/add", method = RequestMethod.POST)
 public String addContact(@ModelAttribute("contact")
 Contact contact, BindingResult result) {
contactService.addContact(contact);
return "redirect:/index";
 }
@RequestMapping("/delete/{contactId}")
 public String deleteContact(@PathVariable("contactId")
 Integer contactId) {
contactService.removeContact(contactId);
return "redirect:/index";
 }
}

Nuestro controlador Spring tiene tres métodos para manipular la gestión de contactos.

  • listContact: Este método utiliza la interfaz de la capa de servicios (ContactServer) para obtener todos los contactos de nuestra aplicación. Debemos tener en cuenta que hemos mapeado el “/index” es decir, que cuando accedamos a demoweb-hibernate/index será cuando llamemos a este método.
  • addContact Este método añade un nuevo contacto a la lista. Con la notación @ModelAttribute obtenemos los datos del contacto.  Debemos tener en cuenta que hemos mapeado el “/add”. El método utiliza una solicitud POST para añadir un contacto sirviendose de la capa de servicio.
  • DeleteContact  Este método elimina un contacto. Al igual que add este método redirecciona a /index. Este método necesita el id para poder eliminar el contacto.

Creando la Vista

Por último solo tenemos que crear una página .jsp

/demoweb-hibernate/src/main/webapp/WEB-INF/jsp/contact.jsp

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
 <title>Spring 3 MVC Series - Contact Manager</title>
 <style type="text/css">
 body {
 font-family: sans-serif;
 }
 .data, .data td {
 border-collapse: collapse;
 width: 80%;
 border: 1px solid #aaa;
 margin: 2px;
 padding: 2px;
 }
 .data th {
 font-weight: bold;
 background-color: #5C82FF;
 color: white;
 }
 </style>
</head>
<body>
<h2><spring:message code="label.title"/></h2>
<form:form method="post" action="add.html" commandName="contact">
<table>
 <tr>
 <td><form:label path="firstname"><spring:message code="label.firstname"/></form:label></td>
 <td><form:input path="firstname" /></td> 
 </tr>
 <tr>
 <td><form:label path="lastname"><spring:message code="label.lastname"/></form:label></td>
 <td><form:input path="lastname" /></td>
 </tr>
 <tr>
 <td><form:label path="email"><spring:message code="label.email"/></form:label></td>
 <td><form:input path="email" /></td>
 </tr>
 <tr>
 <td><form:label path="telephone"><spring:message code="label.telephone"/></form:label></td>
 <td><form:input path="telephone" /></td>
 </tr>
 <tr>
 <td colspan="2">
 <input type="submit" value="<spring:message code="label.addcontact"/>"/>
 </td>
 </tr>
</table> 
</form:form>

<h3>Contactos</h3>
<c:if test="${!empty contactList}">
<table class="data">
<tr>
 <th><spring:message code="label.firstname"/></th>
 <th><spring:message code="label.email"/></th>
 <th><spring:message code="label.telephone"/></th>
 <th>&nbsp;</th>
</tr>
<c:forEach items="${contactList}" var="contact">
 <tr>
 <td>${contact.lastname}, ${contact.firstname} </td>
 <td>${contact.email}</td>
 <td>${contact.telephone}</td>
 <td><a href="delete/${contact.id}">Eliminar</a></td>
 </tr>
</c:forEach>
</table>
</c:if>

</body>
</html>

sss

A la página le hemos dado un poco de color utilizando css y por fin este es el resultado final.

Para que esto se muestre solo tenemos que pinchar sobre el boton play y poner como Goal deploy

 

Aquí tenemos un enlace al código https://github.com/jeslopcru/DemowebMSH

Actualización

Aquí la parte 1: https://jesuslc.com/2013/03/19/poco-a-poco-con-maven-spring-hibernate/

Aquí la parte 2: https://jesuslc.com/2013/03/25/poco-a-poco-con-maven-spring-hibernate-parte-2/

Anuncios

36 comentarios en “Poco a poco con Maven, Spring, Hibernate (parte 3)

      1. Hola Jesus, excelente post. Hice cada paso tal cual como esta en la guia utilizando tomcat 7 y eclipse sts spring, tambien hice lo de desploy y el .war, pero cada que corro el proyecto me sigue saliendo el error 404 (El recurso requerido no está disponible.). Alguna sugerencia?

        Me gusta

    1. Es necesario que indiques /index al final de la ruta, si no no está accediendo a ningún recurso (al ejecutarse en el IDE no se te abre con /index, al menos en Netbeans). Si posteriormente te sale alguna excepción, ya se van solucionando igual que en el IDE

      Me gusta

  1. No entiendo muy bien lo de Para que esto se muestre solo tenemos que pinchar sobre el boton play y poner como Goal deploy.

    De ahí lo que no sé hacer es lo de poner como Goal deploy. ¿Podrías explicármelo?, gracias.

    Me gusta

    1. Hola Miguel!
      Para que todo esto funcione es necesario que tengas instalado el plugin de ecplise m2eclipse en tu eclipse (Aquí un post de como hacerlo: https://jesuslc.com/2012/12/07/usar-maven-desde-eclipse-m2eclipse/) si no es así también puedes hacerlo con la consola de Maven (si tienes práctica)

      Ahora bien, una vez que ya esta el plugin instalado en Eclipse seleccionamos el archivo pom.xml (que se ponga en azul) y nos vamos al menu Run–>Ruan As(también vale el boton play verde) y seleccionamos la opción “maven build…”. Esto nso abrirá un cuadro de dialogo, donde uno de los cuadros de texto pone “goals” allí es donde tenemos que escribir “deploy” (sin comillas), esto nos generará una carpeta nueva en el proyecto llamada target (a veces hay que pulsar F5 para resfrescar el proyecto y que aparezca la carpeta) Esta carpeta tiene un archivo .war
      Una vez que tengamos esto, solo tenemos que pegar este .war dentro de la carpeta webapps que esta en la instalación de Tomcat.
      Cada vez que hagas cambios es necesario que vuelvas a copiar el nuevo war en la carpeta webapps
      Siento que la explicación no haya quedado clara, espero que este comentario te ayude 😉

      No te preocupes, esta operación de copiar el war es un “rollo” así que he escrito un post (el día 8 estará) para hacer todo esto de manera automática. Es decir, le damos al play y solo se genera el archivo war y se copia en webapps de tomat.

      Me gusta

      1. Muchas gracias, aún así me da fallo, cuando pongo en goals lo de deploy y le doy al botón Run todo se va ejecutando bien, pero al final en la consola sale el siguiente error:

        [ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.5:deploy (default-deploy) on project demoweb-hibernate: Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter -> [Help 1]
        [ERROR]
        [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
        [ERROR] Re-run Maven using the -X switch to enable full debug logging.
        [ERROR]
        [ERROR] For more information about the errors and possible solutions, please read the following articles:
        [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

        ¿Cómo podría subsanar ese error?. Por cierto, aún no pude ejecutar la aplicación correctamente.

        Gracias.

        Me gusta

      2. Creo que se me olvidó coméntarlo, hay veces que es necesario “limpiar” antes de hacer deploy.
        Creo que se solucionará poniendo como goals: “clean deploy”

        Un saludo

        Me gusta

  2. Buenos días, estupendo tutorial pero tengo un problema.
    Me ocurre lo mismo que ha Migel. Aun intentando hacer el build desde la consola y sólo con maven. Tengo algo de experiencia con maven y lo he intentado desde eclipse y desde la consola. El war se genera pero el log muestra el error que indica Miguel.
    Muchas gracias

    Me gusta

    1. Buenos días Carlos,
      No te preocupes, creo que eso pasa porque estas intentando hacer un deploy y no has configurado tomcat (u otro servidor de aplicaciones) en Maven. Aquí te dejo un tutorial de como configurar maven y tomcat para que los deploys funcionen: http://www.mkyong.com/maven/how-to-deploy-maven-based-war-file-to-tomcat/ (en el blog hay una traducción de este artículo)
      Si se genera el war puedes copiarlo directamente a la carpeta deploy (con tomcat funcionando) y se desplegará <>.

      Un vez que haya desplegado para probar tienes que entrar aquí: localhost:8080/demoweb-hibernate/index

      Me gusta

      1. Buenas de nuevo.
        Efectivamente no he configurado mi servidor para maven. Yo estoy utilizando GlassFish y quería preguntar si hay alguna manera para que maven genere sólo el WAR, y yo manualmente (mediante el comando “asadmin deploy” de glassfish) puedo desplegar la aplicacion.
        Aunque el maven falla en el deploy, si se genera el WAR que despliego en el servidor y la aplicación funciona correctamnet.
        Muchas gracias por la ayuda, era la URL que la estaba poniendo mal en las pruebas.

        Me gusta

      2. Si mal no recuerdo, creo que son loa comandos de maven. Si utilizas deploy, maven va a crear el war y desplegar la aplicación. En tu caso cómo no tienes configurado el el.servidor de aplicaciones maven te dará un error porque no puede desplegar.

        Si utilizas el comando build (creo aunque mejor compruébalo en la docu de maven) sólo generará el war y ya podrás hacer con el li que quieras.

        Espero que te sea de ayuda. Un saludo.

        Enviado desde mi HTC

        Me gusta

  3. Hola.
    He seguido todos los pasos pero no encuentro la forma de que me funcione….
    Estoy usando tomcat y oracle, por lo que buscando por ahí he cambiado las configuraciones necesarias, pero me sigue dando el siguiente error:

    GRAVE: StandardWrapper.Throwable
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘contactDAOImpl’: Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public org.hibernate.SessionFactory com.jesuslc.contact.dao.ContactDAOImpl.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sessionFactory’ defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property ‘configurationClass’ of bean class [org.springframework.orm.hibernate4.LocalSessionFactoryBean]: Bean property ‘configurationClass’ is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

    ¿Alguien sabría decirme por que es??

    Gracias.

    Me gusta

  4. El tutorial es muy claro, pero debo de estar haciendo algo mal porque no me funciona ni el código del ejemplo que me he bajado.

    Resulta que consigo generar el war y llevarlo a la carpeta webapp de tomcar, pero no consigo verlo en el navegador.

    ¿Cual es la url que debe abrir la página contact.jsp?

    Si saco la página contact.jsp de la ruta /WEB-INF/jsp y lo coloco en la raiz /webapp consigo ver la pagina, pero no procesa las etiquetas de spring, y me lanza excepciones.

    ¿Alguien puede ayudarme?

    Me gusta

  5. El turtorial muy bueno pero cuando lo despliego y quiero ir a la jsp me da el siguiente erro el Tomcat:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘contactController’: Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.contact.service.ContactService com.contact.controller.ContactController.contactService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘contactServiceImpl’: Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.contact.dao.ContactDAO com.contact.service.ContactServiceImpl.contactDAO; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘contactDAOImpl’: Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.contact.dao.ContactDAOImpl.sessionFactory; nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider;

    Lo he probado tanto haciendo paso a paso el ejemplo como descargando el zip del link del proyecto y desplegando ambos war.

    Pdrías Ayudarme??

    Me gusta

    1. Genial el post Jesús, explicado sencillo y directo. Estoy haciendo el TFC con una aplicación que use Spring MVC, Hibernate y Maven y tu post me ha ayudado a meterme en estas tecnologias. Muchisimas gracias!!!

      Me gusta

  6. -Jesus: Excelente material, de primera!. Es genial cuando documentan y explican bien los paso a paso(solo falto mas claridad en el paso final para levantar la app) gracias!!

    -Estimados: para levantar la app de forma facil y puedan probar, lo mejor es que tengan seteado un server Apache Tomcat 7 en su eclipse. A mi me funciono a la primera:

    1.Una vez terminado el proyecto, le hacen un CLEAN en Project>Clean
    2.Recuerden hacer doble click en el server para q los lleve a las propiedades y seleccionar en “Server Locations” la opcion “Use Tomcat Installation”
    3.Con el boton derecho sobre el proyecto, le dan RUN AS > Run on Server.
    4.Se levanta el Tomcat y desde apache o url entren a : http://localhost:8080/demoweb-hibernate/index , que asi esta mapeado el acceso del controller.
    5.Y listo !

    saludos.

    Me gusta

  7. Estimado, gran tutorial.

    Tengo una consulta, He visto la misma estructura en otros proyectos java pero se incluyen dos capas adicionales (business y DTO) ¿Cual sería el beneficio para este tipo de aplicación?.

    Me gusta

    1. Esto es sólo un ejemplo de aplicación. El dividir una aplicación en capas es una “buena práctica”, las ventajas en un ejemplo tan pequeño no son claras. Esta capas sirven para diferenciar/ ordenar el código y las funcionalidades de la aplicación

      Me gusta

  8. Jesus primero que nada muchas gracias por el tutorial. esta muy claro y me ayudo mucho a entender varias cositas… pero tengo un problema con
    @RequestMapping(“/index”)
    public String listContacts(Map map) {
    map.put(“contactw Contact());
    map.put(“contactListntactService.listContact());
    return “contact”;
    }

    el put me da error, dice que no estan cerradas las comillas… soy nueva “javeando”… me podrias dar una manito ? gracias

    Me gusta

  9. Hola….a mi me ha dado algún quebradero con los bean dentro del spring-servlet.xml, pero al final me ha funcionado, después de limpiar errores y siguiendo las pautas de ejecución de TRON.
    Gracias por el post.

    Me gusta

  10. Hola, he seguido paso a paso y al finalizar cuando ya conecto con BD me arroja este error, tendras algun idea?

    GRAVE: Cannot create PoolableConnectionFactory (The server time zone value ‘Hora de verano romance’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.)
    may 15, 2016 1:33:55 PM org.hibernate.cfg.SettingsFactory buildSettings
    ADVERTENCIA: Could not obtain connection metadata
    org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (The server time zone value ‘Hora de verano romance’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.)
    at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:85)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2073)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1298)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:793)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:715)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:189)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:743)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:629)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:677)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:548)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1238)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1151)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1038)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4997)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5289)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.sql.SQLException: The server time zone value ‘Hora de verano romance’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:695)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:663)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:653)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:638)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:606)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:624)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:620)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:68)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1683)
    at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:656)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:349)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:221)
    at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
    at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
    at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)
    at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545)
    … 40 more
    Caused by: com.mysql.cj.core.exceptions.InvalidConnectionAttributeException: The server time zone value ‘Hora de verano romance’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:54)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:73)
    at com.mysql.cj.jdbc.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:118)
    at com.mysql.cj.mysqla.MysqlaSession.configureTimezone(MysqlaSession.java:308)
    at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:2474)
    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1817)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1673)
    … 47 more

    Me gusta

  11. Hola, gracias por esta guia, me sirvio mucho. Pero tengo una consulta, como podria modificar el .jsp en caso de tener que enviar una clase que a su vez tenga un atributo de tipo Clase. Por ejemplo creo un nuevo contacto y le quiero agregar una ciudad en otro form de la misma pagina(una clase ciudad con todos sus atributos), asi de esta manera ya le llegaria una clase cargada al controller.

    Me gusta

  12. Excelente trabajo, me ayudo mucho ha entender como se relaciona spring con hibernate y mysql, mi duda es como seria la conexión con oracle 11g. lo he intentado pero sin exito.

    Espero que me puedas ayudar.

    Gracias

    Me gusta

Comenta la entrada

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s