when I am running test cases that time entity manager is injected successfully but while running web app its throwing NullPointerException

纵然是瞬间 提交于 2020-01-04 06:29:02

问题


I have a strange problem. I am injecting the entity manager using PersistenceContext using applicatioContext bean. But problem is that when I am running test cases that time entity manager is injected successfully but while running web app its throwing NullPointerException

this is abstractRepository where I am injecting entityManager

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

this is my repository where I am using entity manager

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

this is my controller which is calling the repository method

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

these are the unit tests which are passing

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

this is the base repository

 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 {

 }

this is the 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>

Please Help!


回答1:


I solved this problem by replacing

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

with

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


来源:https://stackoverflow.com/questions/16625466/when-i-am-running-test-cases-that-time-entity-manager-is-injected-successfully-b

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!