当我运行测试用例时,实体管理器已成功注入,但在运行 Web 应用程序时抛出 NullPointerException

Posted

技术标签:

【中文标题】当我运行测试用例时,实体管理器已成功注入,但在运行 Web 应用程序时抛出 NullPointerException【英文标题】:when I am running test cases that time entity manager is injected successfully but while running web app its throwing NullPointerException 【发布时间】:2013-05-18 14:39:04 【问题描述】:

我有一个奇怪的问题。我正在使用 applicatioContext bean 使用 PersistenceContext 注入实体管理器。但是问题是,当我运行测试用例时,实体管理器被成功注入,但在运行 Web 应用程序时抛出 NullPointerException

这是我要注入 entityManager 的 abstractRepository

package com.ajit.retail.repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;

public class AbstractRepository 

    @PersistenceContext(type = PersistenceContextType.EXTENDED)
    EntityManager entityManager;

这是我使用实体管理器的存储库

package com.ajit.retail.repository;

import com.ajit.retail.exception.InvalidIdException;
import com.ajit.retail.model.Buyer;
import org.springframework.stereotype.Repository;

import javax.persistence.NoResultException;

@Repository
public class BuyerRepo extends AbstractRepository 

    public Buyer getBuyer(String buyerName) throws InvalidIdException 
        javax.persistence.Query buyerId = entityManager.createNativeQuery("select b.buyer_id from buyer b where b.name = :name").setParameter("name", buyerName);
        Integer id;

        try 
            id = (Integer) buyerId.getSingleResult();

         catch (NoResultException e) 
            return null;
        

        return getBuyer(id);
    

    public Buyer getBuyer(long buyerId) throws InvalidIdException 
        Buyer buyer = entityManager.find(Buyer.class, buyerId); **====> NULL**
        if (buyer == null) throw new InvalidIdException("Invalid Article ID");
        return buyer;
    

这是我的控制器,它正在调用存储库方法

package com.ajit.retail.web;

import com.sun.jersey.spi.inject.Inject;
import com.ajit.retail.exception.InvalidIdException;
import com.ajit.retail.model.Buyer;
import com.ajit.retail.repository.*;
import org.springframework.stereotype.Component;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/buyer")
@Component
public class BuyerController 

    @Inject
    private BuyerRepo buyerRepo;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Buyer searchFields() throws InvalidIdException 
        String buyerId = "51";
        Buyer buyer;

        try 
            buyer = buyerRepo.getBuyer(Long.parseLong(buyerId));
         catch (NumberFormatException e) 
            buyer = buyerRepo.getBuyer(buyerId);
        

        return buyer;
    

这些是通过的单元测试

包 com.ajit.retail.repository;

import com.ajit.retail.exception.InvalidIdException;
import org.hamcrest.core.IsEqual;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import static org.junit.Assert.assertThat;

public class BuyerRepoTest extends BaseRepository 

    @Autowired
    private BuyerRepo buyerRepo;

    @Test
    public void shouldGiveNameOfGivenBuyerId() throws InvalidIdException 
        assertThat(buyerRepo.getBuyer(2).getName(), IsEqual.equalTo("SupervisorDLS"));
    

    @Test(expected = InvalidIdException.class)
    public void shouldThrowExceptionForInvalidBuyerId() throws InvalidIdException 
        buyerRepo.getBuyer(-10);
    

这是基础存储库

 package com.ajit.retail.repository;

import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;

@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class BaseRepository extends AbstractTransactionalJUnit4SpringContextTests 

 

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

    <context:annotation-config/>
    <context:component-scan base-package="com.ajit.retail"/>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver"/>
        <property name="url" value="jdbc:postgresql://localhost/retail"/>
        <property name="username" value="retail_user"/>
        <property name="password" value="password"/>
    </bean>

    <bean id="entityManager" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>

        <property name="packagesToScan" value="com.ajit.retail"/>

        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true"/>
                <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"/>
            </bean>
        </property>
    </bean>

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

    <tx:annotation-driven transaction-manager="transactionManager"/>

    </beans>

请帮忙!

【问题讨论】:

【参考方案1】:

我通过替换解决了这个问题

 <servlet>
        <servlet-name>retail</servlet-name>

        **<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>**

        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.ajit.retail.web</param-value>
        </init-param>

        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>

         <load-on-startup>1</load-on-startup>
    </servlet>

<servlet>
        <servlet-name>retail</servlet-name>

        **<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>**

        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.ajit.retail.web</param-value>
        </init-param>

        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>

         <load-on-startup>1</load-on-startup>
    </servlet>

【讨论】:

以上是关于当我运行测试用例时,实体管理器已成功注入,但在运行 Web 应用程序时抛出 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

运行 Junit 测试用例时“加载 ApplicationContext 失败”

当我尝试运行测试用例时,它显示了 shallowMount 错误,如何修复 VUE.JS 中的 ShallowMount 错误?

在套件中运行测试用例时在 XML testng 文件中出现错误

当我运行测试用例时,出现此错误: psycopg2.OperationalError: cursor "_django_curs_140351416325888_23" does

Junit测试用例在STS中成功运行,但无法通过Jmeter运行。

如何在 bitrise 上运行测试用例时查看模拟器