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
<[email protected]> wrote:
> Could you paste that bit of code please?
>
> On Wednesday, November 19, 2014, Hass Joseph Khafaji <[email protected]>
> 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 <[email protected]
>> <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 <
>> [email protected] <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