2012-11-02 4 views
0

У меня есть 3 типа.NullPointerException при инъекции зависимостей с пружиной

ServiceAffaire.java:

package ws.magicnew.sync; 

... 

@Transactional 
@Service("serviceAffaire") 
public class ServiceAffaire implements IServiceAffaire { 

    private static Log log = LogFactory.getLog(ServiceAffaire.class); 

    //private static SimpleDateFormat sdf = new SimpleDateFormat(MagicFacade.WS_DATE_FORMAT); 

    @Autowired 
    @Qualifier("manifestationService") 
    protected IManifestationService manifestationService; 

    @Autowired 
    @Qualifier("typeDeManifestationService") 
    protected ITypeDeManifestationService typeService; 

    @Autowired 
    @Qualifier("espaceManifestationService") 
    protected IEspaceManifestationService espaceManifService; 

    @Autowired 
    @Qualifier("siteService") 
    protected ISiteService siteService; 

    @Autowired 
    @Qualifier("natureService") 
    protected INatureService natureService; 

    @Autowired 
    @Qualifier("facadeGetAffaire") 
    protected MagicFacade facadeGetAffaire; 

    @Autowired 
    @Qualifier("compteurManifestation") 
    private Compteur compteurManifestation; 

    @Autowired 
    @Qualifier("compteurContenus") 
    protected Compteur compteurContenus; 

     public synchronized void synchronize(boolean setFlag) throws Exception { 
      ... 
     } 
} 

IServiceAffaire.java:

package ws.magicnew.sync; 

public interface IServiceAffaire { 

    public void synchronize(boolean setFlag) throws Exception; 

} 

и CacheAction.java:

package ws.magicnew.sync; 

... 

@Configurable 
@Transactional 
public class CacheAction extends DispatchAction { 

    private static Log log = LogFactory.getLog(CacheAction.class); 

    @Autowired 
    @Qualifier("serviceAffaire") 
    private IServiceAffaire serviceAffaire; 

    public ActionForward getAffaire(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 
     boolean setFlag = Boolean.parseBoolean(CmsProperties.SYNCRO_AFFAIRES_FLAG); 
     log.info("getAffaire debut " +setFlag); 
     serviceAffaire.synchronize(setFlag); // NullPointerException here: serviceAffaire is null 
     log.info("getAffaire fin " +setFlag); 
     request.setAttribute("message", "Le service get affaire a été lancé."); 

     return mapping.findForward("cache"); 
    } 
} 

Проводка выполнена в файле ApplicationContext-scanpackages.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:p="http://www.springframework.org/schema/p" 
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring" 
    xmlns:jaxws="http://cxf.apache.org/jaxws" 
    xmlns:cxf="http://cxf.apache.org/core" 
    xsi:schemaLocation=" 
      http://www.springframework.org/schema/aop 
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
      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/jee 
       http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 
      http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
      http://www.springframework.org/schema/util 
       http://www.springframework.org/schema/util/spring-util-3.0.xsd 
      http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring 
       http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd 
      http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd 
      http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"> 
    <context:annotation-config /> 
    <context:component-scan base-package="ws.magicnew.sync" /> 
    <context:component-scan base-package="ws.magicnew.facade" /> 
</beans> 

Это похоже на меня, но я все еще получаю NullPointerException, когда я вызываю метод CacheAction.getAffaire(). Я не могу понять, почему, и это сводит меня с ума. Любая подсказка?

У меня были некоторые проблемы с введением атрибутов ServiceAffaire (которые я решил), поэтому Spring фактически их автоустанавливает. Но по какой-то причине он не может ввести ServiceAffaire в CacheAction.

Как указано в комментарии в коде, атрибут serviceAffaire является нулевым, когда вызывается ServiceAffaire.synchronize, как я могу видеть, когда я выполняю его в режиме отладки.

+0

Подсказка: благосклонности '@Resource (имя = "..") 'вместо комбинации' @ Qualifier/@ Autowired'. –

+0

Хм .. Не нужно давать smk

+0

@ Саджит: ты прав. Я забыл поместить его в выдержку в вопросе. Я отредактирую его. –

ответ

2

Ваша проблема может быть две вещи:

Во-первых, нужно, чтобы добавить «контекст: весна сконфигурированные» в ApplicationContext-scanpackages.xml, чтобы включить AspectJ.

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.html#aop-atconfigurable

Во-вторых, у вас есть CACHEACTION, как @Configurable, я полагаю, что вы сделали это, потому что вы или некоторые рамки создавать экземпляры CACHEACTION с классическим «новой CACHEACTION()» вместо того, чтобы позволить Spring для его создания.

Если это так, NPE может произойти, если вы создадите экземпляр CacheAction кодом до того, как Spring инициализирует компонент IServiceAffaire. Я имею в виду, что когда вы создаете экземпляр CacheAction с использованием «нового», вы должны быть уверены, что Spring уже завершила инициализацию всех компонентов, которые требуется CacheAction. В противном случае Spring не будет доступен для инъекций зависимостей.

Это может быть сложно, если какая-либо среда создает новые экземпляры CacheAction, и вы не можете контролировать, когда эти экземпляры создаются. Не имеет значения, добавляете ли вы аннотации, такие как «зависит от», так как Spring не сможет сохранить это создание экземпляра, пока не завершит создание компонентов, которые нужно вставить.

Один из способов решения этой проблемы - позволить Spring инициализировать какой-либо компонент, который будет запускать инициализацию того, что создает новые экземпляры CacheAction, и добавить туда «зависимый» компонент IServiceAffaire.

В любом случае правильное решение зависит от того, как инициализируется ваше приложение.

+0

Спасибо! Это привело меня на правильный путь. Init CacheAction выполняется в рамках, но он предлагает другое действие, DefaultAction, наследующее DispatchAction, но имеющее дело с проблемами автоустройства. Поэтому я изменил наследство, и теперь он работает. –

0

Вы можете попытаться изменить инъекции зависимостей аннотацию для IServiceAffaire к @Resource и проверьте, работает ли

@Autowired 
@Qualifier("serviceAffaire") 
private IServiceAffaire serviceAffaire; 

Изменение к

@Resource(name ="serviceAffaire") 
private IServiceAffaire serviceAffaire;