0

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>

NullPointerExceptionこれは私には問題ないようですが、CacheAction.getAffaire()メソッドを呼び出しているときにまだ取得します。理由がわからず、頭がおかしくなっています。どんな手掛かり?

以前、ServiceAffaireの属性の挿入に関していくつかの問題がありました(これは解決しました)。そのため、Springは実際にそれらを自動配線しています。ただし、何らかの理由で、ServiceAffaireをCacheActionに挿入できません。

コードでコメントとして示されているように、デバッグモードで実行するとわかるように、ServiceAffaire.synchronizeが呼び出されるとserviceAffaire属性はnullになります。

4

2 に答える 2

2

あなたの問題は2つのことかもしれません:

まず、AspectJを有効にするために、applicationContext-scanpackages.xmlに「context:spring-configured」を追加する必要があります。

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

次に、@ ConfigurableとしてCacheActionがあります。これは、Springに作成させるのではなく、従来の「new CacheAction()」を使用してCacheActionのインスタンスを作成するフレームワークがあるためだと思います。

その場合、SpringがIServiceAffaire Beanを初期化する前に、コードによってCacheActionのインスタンスを作成すると、NPEが発生する可能性があります。つまり、「new」を使用してCacheActionのインスタンスを作成する場合、SpringがCacheActionに必要なすべてのBeanの初期化をすでに完了していることを確認する必要があります。そうしないと、Springを使用して依存関係を挿入できません。

一部のフレームワークがCacheActionの新しいインスタンスを作成し、それらのインスタンスがいつ作成されるかを制御できない場合、これは注意が必要です。「depends-on」のようなアノテーションを追加しても問題ありません。Springは、注入する必要のあるBeanの作成が​​完了するまで、そのインスタンスの作成を保持できないためです。

これを解決する1つの方法は、CacheActionの新しいインスタンスを作成するものすべての初期化を起動するBeanをSpringに初期化し、そこに「依存」IServiceAffaireBeanを追加することです。

とにかく、正しい解決策は、アプリケーションがどのように初期化されるかに依存します。

于 2012-11-02T15:23:46.850 に答える
0

IServiceAffaireの依存性注入アノテーションを@Resourceに変更して、それが機能するかどうかを確認できますか?

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

への変更

@Resource(name ="serviceAffaire")
private IServiceAffaire serviceAffaire;
于 2012-11-02T16:25:38.840 に答える