Replying to myself:

It works fine if the property to be injected in scala is annotated with 
@scala.reflect.BeanProperty.
This tells the scala compiler to auto-generate getter and setter in the java 
style.

Thx.

Le 3 mai 2011 à 21:20, Nicolas Jouanin a écrit :

> Hi,
> 
> I'm using Aries blueprint from karaf 2.2.0 (aries blueprint 0.3) and I'd like 
> to inject the blueprint bundle context into a bean written in Scala. It seems 
> it doesn't work because I get the following error when running the container :
> org.apache.aries.blueprint - 0.3.0 | Error retrieving service from 
> ServiceRecipe[name='graphDBConfigService']
> org.osgi.service.blueprint.container.ComponentDefinitionException: Unable to 
> find property descriptor context on class 
> org.escapek.ekcmdb.core.neo4j.GraphDBConfigurationService
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.getPropertyDescriptor(BeanRecipe.java:820)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecipe.java:802)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:773)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:754)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:720)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:64)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:60)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:64)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:219)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.container.BlueprintRepository.createInstance(BlueprintRepository.java:198)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.container.BlueprintRepository.create(BlueprintRepository.java:137)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.createRecipe(ServiceRecipe.java:370)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.createService(ServiceRecipe.java:278)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.internalGetService(ServiceRecipe.java:248)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.getService(ServiceRecipe.java:327)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe$TriggerServiceFactory.getService(ServiceRecipe.java:430)[10:org.apache.aries.blueprint:0.3.0]
>       at 
> org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(ServiceRegistrationImpl.java:310)[org.apache.felix.framework-3.0.8.jar:]
> 
> 
> The XML declaration for blueprint is :
>       <bean id="graphDBConfig" 
> class="org.escapek.ekcmdb.core.neo4j.GraphDBConfigurationService">
>               <property name="context" ref="blueprintBundleContext" />
>       </bean>
> 
> GraphDBConfigurationService is a class written in Scala as :
> class GraphDBConfigurationService extends ManagedService with Logging
> {
>   
>       var context : BundleContext = _
> 
>       def updated(properties: Dictionary[_ <: Any,_ <: Any]): Unit = { 
>       }
> }
> 
> 
> In scala, declaring a var like above is normally equivalent as declaring a 
> private field in java with getter and setters. 
> Looking at BeanRecipe source code, I guess the problem comes from 
> ReflectionUtils.getPropertyDescriptors which doesn't find any property 
> descriptors, but I don't know why.
> 
> Any ideas ? Has anyone tried this with Scala ?
> 
> Thanks,
> 
> Nicolas.
> 

Reply via email to