Geromino 3.0.1 を使用して、Aries/Blueprint で OSGI を試しています。次の例外のために壁にぶつかりました:
2013-08-06 10:54:54,832 エラー [BlueprintContainerImpl] バンドル com.xxx.xxx のブループリント コンテナーを開始できません org.osgi.service.blueprint.container.ComponentDefinitionException: コンポーネントをインスタンス化できません org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents (BlueprintContainerImpl.java:644) で org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun (BlueprintContainerImpl.java:331) で org.apache.aries.blueprint.container.BlueprintContainerImpl.run (BlueprintContainerImpl.java:227) で java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) で java.util.concurrent.FutureTask.run (FutureTask.java:138) で java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301 (ScheduledThreadPoolExecutor.java:98) で java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) で java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) で java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) で java.lang.Thread.run(Thread.java:662) で 原因: java.lang.VerifyError: (クラス: com/xxx.xxx/services/impl/$UserServiceImpl307032798、メソッド: 署名: (Ljava/lang/reflect/InvocationHandler;)V) 間違った初期化メソッドの呼び出し java.lang.Class.getDeclaredConstructors0(ネイティブメソッド)で java.lang.Class.privateGetDeclaredConstructors (Class.java:2398) で java.lang.Class.getConstructor0 (Class.java:2708) で java.lang.Class.getConstructor (Class.java:1659) で org.apache.aries.proxy.impl.gen.ProxySubclassGenerator.newProxySubclassInstance (ProxySubclassGenerator.java:159) で org.apache.aries.proxy.impl.AsmProxyManager.createNewProxy (AsmProxyManager.java:81) で org.apache.aries.proxy.impl.AbstractProxyManager.createProxy (AbstractProxyManager.java:50) で org.apache.aries.blueprint.container.BeanRecipe.addInterceptors (BeanRecipe.java:688) で org.apache.aries.blueprint.container.BeanRecipe.internalCreate (BeanRecipe.java:728) で org.apache.aries.blueprint.di.AbstractRecipe.create (AbstractRecipe.java:64) で org.apache.aries.blueprint.container.BlueprintRepository.createInstances (BlueprintRepository.java:219) で org.apache.aries.blueprint.container.BlueprintRepository.createAll (BlueprintRepository.java:147) で org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents (BlueprintContainerImpl.java:640) で ... 10以上
私のJDKバージョンは、Ubuntu 13.04で1.7.0_25-b15です。
私のブループリント構成は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<blueprint
xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0"
xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0">
<!-- DataSource Derby -->
<bean id="dataSourceDerby" class="org.apache.derby.jdbc.EmbeddedDataSource">
<property name="databaseName" value="/home/imme/Data/xxxxdb"/>
<property name="createDatabase" value="create"/>
</bean>
<bean id="dataSourceXADerby" class="org.apache.derby.jdbc.EmbeddedXADataSource">
<property name="databaseName" value="/home/imme/Data/xxxxdb"/>
<property name="createDatabase" value="create"/>
</bean>
<!-- Expose DataSource as JNDI reference -->
<service ref="dataSourceDerby" interface="javax.sql.DataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/xxxxdb"/>
</service-properties>
</service>
<service ref="dataSourceXADerby" interface="javax.sql.XADataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/xaxxxxdb"/>
</service-properties>
</service>
<bean id="userServiceImpl" class="com.xxx.xxx.services.impl.UserServiceImpl">
<tx:transaction method="*" value="Required" />
<jpa:context property="entityManager" unitname="xxx-unit"/>
</bean>
<service id="userService" ref="userServiceImpl" interface="com.xxx.xxxx.services.UserService"/>
</blueprint>
行をコメントアウトすると
<tx:transaction method="*" value="Required" />
、例外は表示されなくなりましたが、コンテナーがトランザクションを開くことができないため、サービスは機能しません。JDK 1.6 で試しましたが、同じ問題です。
助けてくれてありがとう、ありがとう!