sábado, 7 de enero de 2012

Configuración proyecto Spring

En la carpeta lib añadimos todas las librerias que necesitamos para que funcione Spring, como el proyecto lo tengo avanzado en estos momentos, tengo muchas librerias más a parte, para el funcionamiento de hibernate, seguridad de Spring, etc.




 
Las que tienen el guión al final son las que no he utilizado por el momento.

En el fichero web.xml tengo lo siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>                
             /WEB-INF/configuration/applicationContext-security.xml
             /WEB-INF/configuration/applicationContext-business.xml   
       </param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/properties/log4j.properties</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>
 
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
 
  <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/servlets/spring.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>    
  </servlet>
  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/spring/*</url-pattern>   
  </servlet-mapping>
 
  <display-name>SpringWeb</display-name>
  <welcome-file-list>
      <welcome-file>redirect.jsp</welcome-file>   
  </welcome-file-list>
</web-app>

En contextConfigLocation tengo la configuración de Spring junto con la seguridad.

He declarado el servlet spring y le he establecido la ruta donde se encuentra su archivo de configuración. Automáticamente Spring detecta el archivo servlet-spring.xml dentro de /WEB-INF/ si no se le estable la configuración de esta manera.

También le he añadido el filtro springSecurityFilterChain que es necesario si se quiere utilizar la capa de seguridad de Spring. Para mí es necesario conocer esto al dedillo.

En el fichero de configuración applicationContext-business.xml tengo lo siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:security="http://www.springframework.org/schema/security"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

    <aop:aspectj-autoproxy /> 
    <tx:annotation-driven transaction-manager="transacctionManager"/>

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:database.properties</value>
            </list>
        </property>
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="initialSize" value="15" />
        <property name="maxActive" value="30" />
        <property name="maxIdle" value="10" />
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <!--<property name="configLocation" value="classpath:hibernate.cfg.xml" /> -->
        <property name="dataSource" ref="dataSource"/>
        <property name="exposeTransactionAwareSessionFactory"><value>false</value></property>       
        <property name="mappingResources">
            <list>
                <value>news.hbm.xml</value>
                <value>module.hbm.xml</value>
                <value>newspaper.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">update</prop>               
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.query.substitutions">true 'T', false 'F'</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.c3p0.minPoolSize">5</prop>
                <prop key="hibernate.c3p0.maxPoolSize">20</prop>
                <prop key="hibernate.c3p0.timeout">600</prop>
                <prop key="hibernate.c3p0.max_statement">50</prop>
                <prop key="hibernate.c3p0.testConnectionOnCheckout">false</prop>
                <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate3.SpringSessionContext</prop> 
                  <prop key="hibernate.transaction.factory_class">org.springframework.orm.hibernate3.SpringTransactionFactory</prop>
                <prop key="hibernate.current_session_context_class">thread</prop>               
                <prop key="show_sql">true</prop>                           
            </props>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="hibInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
</beans>

Con esto tendríamos la capa de persistencia.

Como se puede ver he añadido los siguiente ficheros de hibernate para mapear clases a tablas de bd. Estos ficheros tienen que estar dentro de la carpeta "resources" que dije que crearamos al principio para que cuando se compile el proyecto se copien en el classpath.

classpath:database.properties

<value>news.hbm.xml</value>
<value>module.hbm.xml</value>
<value>newspaper.hbm.xml</value>

Por ejemplo en mi caso queda así:




7 comentarios:

  1. Buenas tardes, hice una prueba de el codigo y no finciona con las version de spring 3.1 y hibernate 3.6.10 si crea las tablas pero al momento de almacenar un dato manda un error de "saveOrUpdate is not valid without active transaction" has hecho algun proyecto con esas versiones y si tienes un ejemplo en algun lado para darle un vistaso. saludos. Mauricio

    ResponderEliminar
  2. Buenas, ¿has mirado todas las entradas? Ese error también me daba a mi y termine solucionandolo. Creo que lo arregle con la entrada "Configuracion Hibernate en Spring" ¿puedes probarlo a ver si te funciona con eso?

    ResponderEliminar
  3. Lo que se crea en esa entrada es una conexión con la base de datos cada vez que se accede a la web para realizar todas las llamadas a base de datos y en terminar de cargarse la web cierra la conexión. Era ineficiente porque tiene que abrir una conexión y a lo mejor no se tiene que consultar a la base de datos necesariamente sin embargo si funcionaba. Despues daba errores porque intentaba crear un objeto que ya existia en base de datos y por alguna razon no lo actualizaba sino que lo intentaba crear asi que creo que utilicé la función save y update por separado. Pero tendría que mirarlo. ¿Mira a ver si te funciona con la modificación de la entrada que te he puesto anteriormente?

    ResponderEliminar
  4. En java Mexico publique mi configuracion pero ahora con hibernate 4, ya intente con lo que recomendates y no corregi el error. te doy el url para que le des un vistazo Java México
    y me des tu aponion.
    saludos.

    ResponderEliminar
  5. Buenas. Según veo yo y he mirado el posible problema en otras webs, es que no habilitas las anotaciones de transacciones. Ademas creo que tienes que abrir una transaccion antes de hacer el saveOrUpdate porque creo que yo al utilizar HibernateTemplate no necesito preocuparme por las transacciones porque el las abre y las cierra según se necesite pero tu al utilizar directamente la session deberias abrir una transaccion antes de guardar el objeto mTransaction = mSession.beginTransaction();
    getHibernateTemplate().saveOrUpdate(entity);
    y después cerrar la transacción. No lo puedo probar ahora mismo pero intentalo y me cuentas si te ha funcionado. Saludos.

    ResponderEliminar
  6. Hola buenos dias.
    Segun lei el HibernateTemplate ya lo quitaron por que segun las transacciones son mas naturales. de hecho en mis clases utilizo @Transactional para indicar una transaccion. pero aun asi manda el error. gracias por los comentarios. ya tengo otra configuracion de hibernate 4, pero al final sigo llegando al mismo problema.
    Saludos

    ResponderEliminar
  7. Que onda chavo.
    Ya hice funcionar tu ejemplo con spring 3.1 y hibernate 3.6 y funciona correctamente hubo algunas cosas adicionales que le puse al proyecto para que funcionara pero al final quedo. gracias por todo. Eperare un poco mas para que correjir el problema de hibernate 4.1 ya que tenia que sacar la configuracion.
    gracias.
    Nota: Te recomiendo que pongas tus ejemplos en algun control de versiones publicos para integrarlo mas rapido. Yo hare lo propio si quieres compartir algun comentario me encuentras en skype "avefenix_x"

    ResponderEliminar