Имам странен проблем. Инжектирам мениджъра на обекти, използвайки 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>
Моля, помогнете!