簡體   English   中英

Spring對依賴注入的NullPointerException

[英]NullPointerException on dependency injection with Spring

我有3種類型。

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>

這對我來說似乎沒問題,但是當我調用CacheAction.getAffaire()方法時,我仍然得到一個NullPointerException 我無法弄清楚為什么,它讓我發瘋。 任何線索?

我以前遇到過注入ServiceAffaire屬性的問題(我解決了),所以Spring實際上是自動裝配它們。 但由於某種原因,它無法將ServiceAffaire注入CacheAction。

如代碼中的注釋所示,當調用ServiceAffaire.synchronize時,serviceAffaire屬性為null,正如我在調試模式下執行時所看到的那樣。

你的問題可能是兩件事:

首先,您需要在applicationContext-scanpackages.xml中添加“context:spring-configured”以啟用AspectJ。

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

其次,你將CacheAction作為@Configurable,我想你這樣做是因為你或某個框架用經典的“new CacheAction()”創建了CacheAction的實例,而不是讓Spring創建它。

如果是這種情況,如果在Spring初始化IServiceAffaire bean之前通過代碼創建CacheAction實例,則可能發生NPE。 我的意思是,當你使用“new”創建一個CacheAction實例時,你必須確保Spring已經完成初始化CacheAction所需的所有bean。 否則Spring將無法注入依賴項。

如果某個框架創建了CacheAction的新實例,並且無法控制何時創建這些實例,那么這可能會很棘手。 如果你添加像“depends-on”這樣的注釋並不重要,因為在完成創建需要注入的bean之前,Spring將無法保存該實例。

解決這個問題的一種方法是讓Spring初始化一些bean,它會觸發任何創建CacheAction新實例的初始化,並在那里添加一個“依賴”的IServiceAffaire bean。

無論如何,正確的解決方案取決於您的應用程序的初始化方式。

你能嘗試將IServiceAffaire的依賴注入注釋更改為@Resource並檢查它是否有效

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

改成

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM