когато изпълнявам тестови случаи, този път мениджърът на обекти се инжектира успешно, но докато изпълнявам уеб приложение, той хвърля NullPointerException

Имам странен проблем. Инжектирам мениджъра на обекти, използвайки PersistenceContext, използвайки applicatioContext bean. Но проблемът е, че когато изпълнявам тестови случаи, мениджърът на времеви обекти се инжектира успешно, но докато изпълнява уеб приложение, той хвърля NullPointerException

това е abstractRepository, където инжектирам 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;
}

това е моето хранилище, където използвам мениджър на обекти

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>

Моля, помогнете!


person Ajit Singh    schedule 18.05.2013    source източник


Отговори (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>
person Ajit Singh    schedule 20.05.2013