That's an usual problem you're having. You should be able to see the service 
you've defined in the OSGi panel before executing the request that creates the 
model.

-Jason
________________________________________
From: Hasanein Khafaji <hasanein....@gmail.com>
Sent: Wednesday, November 19, 2014 6:54 AM
To: users@sling.apache.org
Subject: Re: Injecting OSGI services using sling models

Sorry, I forgot to add that. It implements ManagedService.

Do you think it has anything to do with the fact that the interface
and the implementation are in different bundles, thus get loaded by a
different class loader? and end up being incompatible when reflection
is used to set one type to the other?

I've tried o keep the interface and the implementation in a single
bundle and it seems to be working now. But I am deviating from the
project convention we have in place to keep interfaces in separate
bundle than it's implementation.

On Wed, Nov 19, 2014 at 11:43 AM, Felix Meschberger <fmesc...@adobe.com> wrote:
> Hi
>
> Could it be that you announce the component to be „ManagedService“ but the 
> class does not implement it and thus the component cannot be instantiated at 
> all ?
>
> Regards
> Felix
>
>> Am 19.11.2014 um 12:32 schrieb Hasanein Khafaji <hasanein....@gmail.com>:
>>
>> Let's assume that Bundle A defines a service interface and export the
>> package that contains it to OSGi:
>>
>> Public interface ServiceInterface
>> {
>>      .....
>> }
>>
>> Bundle B, provides an OSGi component/service that implement the
>> service interface
>>
>> @Component(immediate = true, metatype = true)
>> @Service(value = {ServiceInterface.class, ManagedService.class})
>> @org.apache.felix.scr.annotations.Properties({
>>        @Property(name = Constants.SERVICE_PID, value =
>> "com.example.MyService"),
>>        @Property(name = Constants.SERVICE_VENDOR, value = "Contoso"),
>>        @Property(name = Constants.SERVICE_DESCRIPTION, value = "My Service"),
>> })
>> public class MyService implements ServiceInterface
>> {
>>     ...
>> }
>>
>> Bundle C, contains Sling model classes that needs to use the above
>> service, we inject it using @Inject or @Inject @Source("osgi-service")
>> as per Sling Model documentation
>>
>> @Model(adaptables = {Resource.class})
>> public class MyModel
>> {
>>    @Inject
>>    private ServiceInterface serviceInterface;
>>    ...
>> }
>>
>> The problem is that the service never get injected into the model as
>> it should be, the Exception we get is thrown by the
>> ModelAdapterFactory saying that it's unable to inject MyService into
>> ServiceInterface as if they were an incompatible types but they are
>> not.
>>
>> On Wed, Nov 19, 2014 at 9:24 AM, Sarwar Bhuiyan
>> <sarwar.bhui...@gmail.com> wrote:
>>> Could you paste that bit of code please?
>>>
>>> On Wednesday, November 19, 2014, Hass Joseph Khafaji 
>>> <hasanein....@gmail.com>
>>> wrote:
>>>
>>>> The model is simply a sling model class, not an osgi service at all.
>>>>
>>>> The model is being looked up via slightly, thus it has to be fully
>>>> populated when that happen which require that the model invoke a service to
>>>> obtain data from.
>>>>
>>>> Sling model documentation says that you can inject osgi services into
>>>> sling models but that is not seem to be working.
>>>>
>>>> Sent from my iPhone
>>>>
>>>>> On 19 Nov 2014, at 09:09, Sarwar Bhuiyan <sarwar.bhui...@gmail.com
>>>> <javascript:;>> wrote:
>>>>>
>>>>> The model is not an OSGi service/component right?
>>>>>
>>>>> I'm not sure of why you need a reference to an osgi service in the model
>>>>> but you can probably use a setter by yourself but I still think you can
>>>>> just have another service which does the action on the model instead of
>>>> the
>>>>> model calling the service.
>>>>>
>>>>> On Wednesday, November 19, 2014, Hass Joseph Khafaji <
>>>> hasanein....@gmail.com <javascript:;>>
>>>>> wrote:
>>>>>
>>>>>> Hello,
>>>>>>
>>>>>> I am trying to inject OSGI service defined using scr annotation into a
>>>>>> sling model class using the @inject annotation.
>>>>>>
>>>>>> What we seem to be getting is that the ModelAdapterFactory is unable to
>>>>>> inject the service into the corresponding field as if it was an
>>>>>> incompatible type. We not doing anything fancy here, it's just a simple
>>>>>> service injection.
>>>>>>
>>>>>> Did anyone faced a similar issue in the past? Do we have to use custom
>>>>>> injectors for this?
>>>>>>
>>>>>> Note: tried to use the @inject @source with an osgi-service but getting
>>>>>> the same result.
>>>>>>
>>>>>> Cheers.
>>>>
>

Reply via email to