2016-05-09 1 views
0

Я пытаюсь создать службу аудита с EntityManager. Однако этот EntityManager никогда не инициализируется при запуске приложения, поэтому при вызове он выдает NullPointerException.NullPointerException для EntityManager с использованием @PersistenceContext

Мой код выглядит следующим образом:

import org.springframework.stereotype.Service; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 


@Service 
public class AuditServiceImpl implements AuditService { 

    private static final String FULL_NAME = "%s %s"; 

    @PersistenceContext 
    private EntityManager entityManager; 

    public EntityManager getEntityManager(){ 
     return entityManager; 
    } 
} 

Я ожидал, что @PersistenceContext аннотацию бы исправить это для меня, но это не так. Я видел несколько других сообщений о подобных проблемах, но большинство решений выглядят устаревшими, поэтому я решил создать еще один пост.

Может ли кто-нибудь пролить свет на проблему, может быть, даже на решение?

+0

Как вы создаете экземпляр 'AuditServiceImpl'? –

+0

Я использую для этого конструктор по умолчанию. –

+0

И как вы ожидаете, что Spring добавит зависимости в экземпляр компонента, который он не знает? Если вы создаете экземпляры самостоятельно, никакие зависимости не будут введены. –

ответ

-1

Вместо введения EntityManager, вводят EntityManagerFactory в коде

Пожалуйста, смотрите ниже:

@PersistenceUnit(unitName = "persistanceUnitName") private EntityManagerFactory entityManagerFactory;

А потом для получения EntityManager, пожалуйста, выполнить код ниже:

public EntityManager getEntityManager(){ return entityManagerFactory.createEntityManager(); }

+0

Спасибо, но он по-прежнему дает исключение NullPointerException для return entityManagerFactory.createEntityManager(); –

+0

Проверьте, правильно ли указано persistanceUnitName в файле persistance.xml. – shankarsh15

+0

Я не использую упорство.xml, так как я использую аннотации. –

0

Прежде всего, убедитесь, что EntityManagerFactory и per Строка состояния настроена правильно. Простой стиль XML будет как:

<context:component-scan base-package="..." /> 
<bean id="myEmf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="yourPersistenceUnit" /> 
</bean> 

Но из вашего комментария вниз под вопрос выглядит как AuditServiceImpl ссылаются может быть причиной. В основном клиент, который использует AuditService, должен получить ссылку из контейнера Spring IoC, а не создавать экземпляр самого объекта. Это может быть сделано различным способом, как с помощью ApplicationContext, если экземпляр контейнера в отдельное приложение через стиль XML:

ApplicationContext context = 
     new ClassPathXmlApplicationContext(new String[] {"yourApplicationContext.xml"}); 
AuditService auditService = context.getBean("auditService", AuditService.class); 
auditService.doSomething(); 

Или вводят услугу в клиенте на веб-слой, если вы используете Spring MVC.

@Controller 
public class MyController { 
    @Autowired 
    AuditService auditService; 

    public void foo() { 
     auditService.doSomething(); 
    } 
} 
Смежные вопросы