java - 在 Spring MVC 应用程序中修复 Null EntityManger?

标签 java spring jpa spring-mvc entitymanager

在下面的代码中,我注入(inject)的 EnitityManager 出现了问题,它总是显示为 null

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;
    }
}

这是 bean 定义,在 dispatcher-servlet.xml 中定义。

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

EntityManager 应该根据 tx:annotation-based 注入(inject),在 persistence-context.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: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> 

持久性上下文从 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>

类路径导入已完成,因为 ORM 实体作为 JAR 文件包含在项目中。请注意,我相信持久性上下文正在加载,因为如果 Spring 无法解析其配置文件,它将不允许部署应用程序。

这是我的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>

还有我的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>

有人能帮我吗?

最佳答案

今天我很幸运能够与顾问讨论这个问题,他能够帮助我解决整个问题。

所以我的问题是 Spring MVC 正在建立两个不同的上下文,一个是在 applicationContext.xml 中定义的应用程序上下文,另一个是在 dispatcher-servlet.xml 中定义的 web 上下文。

来自一个上下文的 beans 不能与另一个上下文中的 beans 对话,因此当我在 applicationContext.xml 中初始化我的持久性上下文时,我无法在由 dispatcher-servlet.xml 加载的 beans 中访问它,即我的 Controller 。

当 Netbeans 为我的 Spring MVC 自动生成基础时,它默认设置了它。在一些大型 Web 应用程序中,将应用程序的 Web 部分在与其余逻辑(持久性、业务代码等)不同的上下文中分离是有意义的。在我的例子中,我试图将我的实体管理器直接自动注入(inject)到我的 Controller 中,这对我不利。

为了解决这个问题,我移动了行

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

从 applicationContext.xml 到我的 dispatcher-servlet.xml。然后我的 Controller 从 @PersistanceContext 注释中正确地注入(inject)了 EntityManagers。

关于java - 在 Spring MVC 应用程序中修复 Null EntityManger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/888581/

相关文章:

java - Postgres 和 JOOQ 不区分大小写的正则表达式?

java - Hibernate + MySQL 报告数据的最佳实践

java - 使用 spring boot 的 LinkedIn 身份验证

java - JsonView - 定义默认 View

java - Spring JPA 使用 RowCount 删除查询

Java EE RESTful 服务 JSON 编码 415 状态与 @Xml* 注释

java - C 中是否有类似于 Java 的 string 'charAt()' 方法?

java - 使用 HashMaps Java

java - 将字符串转换为特定格式的日期时间对象(例如不带日期)

java - 在 Spring MVC Controller 中反序列化 json 数组