Pregunta

En el siguiente código Soy problemas con mi EnitityManager inyectada, lo que muestra siempre como nulo ;

public class GenericController extends AbstractController {

    @PersistenceContext(unitName = "GenericPU")
    private EntityManager em;

    protected ModelAndView handleRequestInternal(
            HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        //(em == null) is always trigged
        if (em == null) throw new NullPointerException("em is null");
        Collection<Generic> Generics = em.createNamedQuery("Generic.findAll").getResultList();

        ModelAndView mav = new ModelAndView("Generic");
        mav.addObject(Generics); 
        return mav;
    }
}

Aquí está la definición de frijol, que se define en despachador-servlet.xml .

<bean id="Generic" class="com.application.web.GenericController" />

EnitityManager debe inyectarse basa en TX:.-Basada anotación, definido en el persistencia-context.xml archivo

<?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:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
        <property name="url" value="removed" />
        <property name="username" value="removed" />
        <property name="password" value="removed" />
    </bean>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="GenericPU" />
        <property name="dataSource" ref="dataSource" />
        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
        </property>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="false" />
                <property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" />
            </bean>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

</beans> 

La persistencia del contexto se carga desde el applicationContext.xml

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">    
    <import resource="classpath:META-INF/persistence-context.xml"/>
</beans>

La importación ruta de clases se hace porque las entidades ORM se incluyen como un archivo JAR en el proyecto. Tenga en cuenta que creo que se está cargando la persistencia del contexto, como la primavera no va a permitir que la aplicación se desplegará si no puede analizar sus archivos de configuración.

Aquí está mi persistence.xml .

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="CoolOrmJpaPU" transaction-type="RESOURCE_LOCAL">
    <class>com.application.orm.jpa.Generic</class>
    <!-- bunch more classes -->
  </persistence-unit>
</persistence>

Y mi web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>redirect.jsp</welcome-file>
    </welcome-file-list>
</web-app>

¿Alguien puede echarme una mano?

¿Fue útil?

Solución

He tenido la suerte de hoy para poder hablar con un consultor sobre este tema, que fue capaz de ayudar a clasificar todo el asunto.

Así que mi problema es que Spring MVC estaba estableciendo dos contextos distintos , un contexto de aplicación, definido en applicationContext.xml y uno contexto web, que se define en el despachador-servlet.xml.

Los frijoles de un contexto no pueden hablar con los granos en otro contexto, por lo tanto cuando initilized mi contexto de persistencia en el interior de applicationContext.xml, no podía acceder a él en los granos cargados por despachador-servlet.xml, es decir, mis controladores.

Cuando Netbeans auto-genera la base de mi MVC primavera instalar esto por defecto. En algunas grandes aplicaciones web, lo que tendría sentido separar la parte web de la aplicación en un contexto distinto del resto de la lógica (persistencia, código de negocio, etc.). En mi caso, cuando estoy tratando de auto inyectarse mi gestor de la entidad directamente a los controladores, esto funcionó en mi contra.

Para solucionar el problema Moví la línea

<import resource="classpath:META-INF/persistence-context.xml"/>

Desde el applicationContext.xml, a mi despachador-servlet.xml. Mis controladores a continuación, se inyectaron correctamente con EntityManagers de la anotación @PersistanceContext.

Otros consejos

Creo que se necesita un persistence.xml archivo:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

  <persistence-unit name="GenericPU">
     <class>com.domain.MyClass</class>
  </persistence-unit>

</persistence>

Creo que no va a funcionar si el archivo tiene un nombre diferente, sobre todo, no ya no le dice a la fábrica EntityManager el nuevo nombre en ninguna parte.

Yo solía trabajar con una versión primaveral mayor, cuando había que poner setProperty () para el grano y establecer la etiqueta Propery dentro de la definición de frijol primavera como:

<bean id="Generic" class="com.application.web.GenericController" />
    <property name="em" ref="entityManager" />
</bean>

Tal vez debería trabajar con el transactionManager o las habas EntityManagerFactory ...

PD:. Yo personalmente prefiero la vieja manera de la inyección de dependencias

¿Ha incluido

<context:annotation-config />

En el código XML primavera. aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top