2013-07-02 4 views
5

Spring MVCとVirgo Webserverを使用してOSGiアプリケーションでモジュールを開発しています。tx:annotation-drivenを使用するとBeanのオートワイヤリングを防ぐ

私のモジュールでは、マネージャにアクセスするコントローラがあります。コントローラには、レポートの生成を処理するハンドラのリストがあります。

私は外部サービスからトランザクションメソッドを呼び出さなければならないまで、すべてうまくいっていました。私のクラスのどれもがトランザクションではなかったので、トランジションマネージャとannotation-drivenへの参照を追加する必要がありました。その後、私のマネージャーは通知を受けなくなりました。

annotation-drivenを使用すると、すべてのBeanがプロキシメカニズムを動作させるためにすべてのBeanでパブリックインターフェイスを実装する必要があることを理解しています。そして、私が知る限りでは、すべてのクラスがあります(そのうちの1つはありませんでしたが、私はそれを変更しました)。

マイコンフィギュレーション・ファイルは、次のとおりです。

バンドルのcontext.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:aop="http://www.springframework.org/schema/aop" 
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-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-3.0.xsd"> 
<context:annotation-config /> 
<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean id="reportManager" class="reportmodule.manager.impl.ReportManagerImpl"/> 
<bean id="mvpepReportHandler" class="reportmodule.manager.impl.MVPEPReportHandler"/> 
<bean id="reportConfigDao" class="reportmodule.repository.impl.ReportConfigurationHibernateDAOImpl"/> 
<bean id="oSGIChangeReportHandler" class="reportmodule.osgi.impl.OSGIChangeReportHandlerImpl"/> 
<bean id="reportController" 
class="reportmodule.controller.impl.ReportControllerImpl"/> 
<bean id="reportControllerHandlerMapping" 
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
<property name="mappings"> 
<value>/module/reportController/**=reportController</value> 
</property> 
<property name="alwaysUseFullPath" value="true"></property> 
</bean> 
</beans> 

と私のバンドル-osgi.xmlは、次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:osgi="http://www.springframework.org/schema/osgi" 
xmlns:osgi-compendium="http://www.springframework.org/schema/osgi-compendium" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/osgi 
http://www.springframework.org/schema/osgi/spring-osgi.xsd 
http://www.springframework.org/schema/osgi-compendium 
http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium-1.2.xsd"> 

<osgi:reference id="transactionManager" interface="org.springframework.transaction.PlatformTransactionManager" /> 
<osgi:reference id="sessionFactory" interface="org.hibernate.SessionFactory" /> 
<osgi:reference id="smaCoreUtilService" interface="core.util.service.SmaCoreUtilService" /> 

<osgi:service ref="reportControllerHandlerMapping" 
interface="org.springframework.web.servlet.HandlerMapping" 
context-class-loader="service-provider" 
auto-export="interfaces"/> 

<osgi:service interface="reportmodule.api.manager.ReportManager" ref="reportManager" auto-export="interfaces"/> 

<osgi:service interface="reportmodule.api.manager.ReportHandler" ref="mvpepReportHandler" auto-export="interfaces"/> 

<osgi:service interface="reportmodule.repository.ReportConfigurationDAO" ref="reportConfigDao" auto-export="interfaces"/> 

<osgi:service interface="reportmodule.osgi.OSGIChangeReportHandler" ref="oSGIChangeReportHandler" auto-export="interfaces"/> 

<osgi:list cardinality="0..N" id="reportHandler" interface="reportmodule.api.manager.ReportHandler" greedy-proxying="true"> 
<osgi:listener ref="oSGIChangeReportHandler" bind-method="register" unbind-method="unregister"/>  
</osgi:list> 

</beans> 

ので、結局oSGIChangeReportHandler.registerが呼び出されてサービスが公開されています(私はdebbugできます):

@Service(value="oSGIChangeReportHandler") 
public class OSGIChangeReportHandlerImpl implements OSGIChangeReportHandler { 

    private ReportManager reportManager; 

    /** 
    * @param reportManager the reportManager to set 
    */ 
    @Autowired 
    public void setReportManager(ReportManager reportManager) { 
     this.reportManager = reportManager; 
    } 

    @SuppressWarnings("rawtypes") 
    public void register(ReportHandler reportHandler, Map properties) { 
     reportManager.addReportHandler(reportHandler); 
    } 

    @SuppressWarnings("rawtypes") 
    public void unregister(ReportHandler reportHandler, Map properties) { 
     reportManager.removeReportHandler(reportHandler); 
    } 


} 

とデバッガがregister法上のreportManagerreportHandlerの両方のためのプロキシを示しているが、デバッガはReportManagerImpl.addReportHandler方法で停止していません:私はtx:annotation-drivenタグを削除すると、私はあることを強調しなければならない

@Service(value="reportManager") 
@Transactional(propagation = Propagation.MANDATORY, rollbackFor = Exception.class) 
public class ReportManagerImpl implements ReportManager { 

    private ReportConfigurationDAO reportConfigurationDAO; 

    private ArrayList<ReportHandler> reportHandlers = new ArrayList<ReportHandler>(); 

    /** 
    * @param reportConfigurationDAO the reportConfigurationDAO to set 
    */ 
    @Autowired 
    public void setReportConfigurationDAO(ReportConfigurationDAO reportConfigurationDAO) { 
     this.reportConfigurationDAO = reportConfigurationDAO; 
    } 

    @Override 
    @Transactional 
    public InputStream gerarRelatorio(ReportRequest repoReq) throws NegocioException { 
     // Generates the report... 
    } 

    /* (non-Javadoc) 
    * @see reportmodule.api.manager.ReportManager#addReportHandler(reportmodule.api.manager.ReportHandler) 
    */ 
    @Override 
    public void addReportHandler(ReportHandler handler) { 
     if (handler != null) { 
      this.reportHandlers.add(handler); 
     } 
    } 

    /* (non-Javadoc) 
    * @see reportmodule.api.manager.ReportManager#removeReportHandler(reportmodule.api.manager.ReportHandler) 
    */ 
    @Override 
    public void removeReportHandler(ReportHandler handler) { 
     if (handler != null) { 
      this.reportHandlers.remove(handler); 
     } 
    } 

} 

bundle-context.xmlファイルからすべて正常に動作します(起動時にhandlerがリストに正しく追加されています)。

ここで私は何が不足していますか?

+0

は 'reportManager'です'oSGIChangeReportHandler.register'にはnullがありますか? – Avi

+0

いいえ!これは、デバッガ上にプロキシオブジェクトを表示します。しかし、私は問題を解決した、答えは以下のとおりです。コメントありがとう、tho。 :) –

答えて

2

問題が解決しました。

上記のコードからわかるように、私はXMLAnnotationの両方でBeanを定義していました。したがって、すべてのBeanは実行時に複製されました。次に、tx:annotation-drivenタグを追加すると、アプリケーションは間違ったBeanをインターセプトし始めました。それは確かに豆を通知していましたが、孤児の豆です。

関連する問題