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

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

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.