dev@glassfish.java.net

Re: Debugging Dependency Injection in GlassFish

From: Ken <ken.cavanaugh_at_oracle.com>
Date: Tue, 04 Jan 2011 11:03:12 -0800

On 01/ 4/11 10:59 AM, Jerome Dochez wrote:
> On Jan 4, 2011, at 10:57 AM, Ken Cavanaugh wrote:
>
>
>> On 01/ 4/11 10:39 AM, Jerome Dochez wrote:
>>
>>> On Jan 4, 2011, at 10:25 AM, Ken wrote:
>>>
>>>
>>>
>>>> On 01/ 4/11 09:58 AM, Jerome Dochez wrote:
>>>>
>>>>
>>>>> On Jan 4, 2011, at 9:36 AM, Ken wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> I've made a few changes in the FOLB code in glassfish-naming, and now some
>>>>>> of the surefire tests for naming are failing. The scenario is that SerialInitContextFactory
>>>>>> needs to call GlassFishORBHelper.getORB(). GlassFishORBHelper is annotated
>>>>>> with @Service and implements PostConstruct and ORBLocator.
>>>>>> The PostConstruct method calls
>>>>>>
>>>>>> orbFactory = habitat.getByContract( GlassFishORBFactory.class ) ;
>>>>>>
>>>>>> where habitat was obtained from @Inject on a field.
>>>>>> The tests are failing because orbFactory is null.
>>>>>>
>>>>>> ORBFactory is an @Contract interface, which is implemented
>>>>>> by GlassFishORBFactoryImpl, which is a class annotated with @Service.
>>>>>> GlassFishORBFactoryImpl also implements PostConstruct.
>>>>>>
>>>>>> So how do I debug this and figure out why getByContract returned null?
>>>>>> I haven't changed any of the annotations, so presumably something else is failing,
>>>>>> but what?
>>>>>>
>>>>>> A quick look into getByContract seems to indicate that the byContract MultiList
>>>>>> does not contain GlassFishORBFactory, but why?
>>>>>>
>>>>>>
>>>>>>
>>>>> does it contain anything ?
>>>>>
>>>>>
>>>>>
>>>> Yes, byContract had I think 52 entries in it (just not the one I needed).
>>>>
>>>>
>>> There are 52 implementations of org.glassfish.enterprise.iiop.api.GlassFishORBFactory ?
>>>
>>>
>> No, there were 52 different services in byContract, none of which were the one I needed.
>>
>>>
>>>
>>>>> the first thing I would check is the content in the META-INF/inhabitants/default file in your implementation module.
>>>>> does the file exist ?
>>>>> does it have an entry for your GlassFishORBFactoryImpl service ?
>>>>>
>>>>>
>>>>>
>>>> It contains 3 entries, one of which is:
>>>>
>>>> class=org.glassfish.enterprise.iiop.impl.GlassFishORBFactoryImpl,index=org.glassfish.enterprise.iiop.api.GlassFishORBFactory
>>>>
>>>> which I presume is what is needed there.
>>>>
>>>>
>>> yes.
>>>
>>>
>>>> Is there some runtime debugging I can do here?
>>>>
>>>>
>>>>
>>> can you call this method on the habitat and observe the result ?
>>>
>>> public Collection<Inhabitant<?>> getAllInhabitantsByContract(String contractType)
>>>
>>> in particular do you find an Inhabitant that describe your service ?
>>>
>>>
>>>
>>>
>> I added
>>
>> Collection<Inhabitant<?>> objs =
>> habitat.getAllInhabitantsByContract(
>> GlassFishORBFactory.class.getName() ) ;
>>
>> and when running the tests, objs is an empty collection.
>>
> then I would say your jar inhabitant file is not parsed into the habitat. where is it located ? is it in the modules directory ?
>
>
It's in orb/orb-iiop in the workspace. The target directory contains
orb-iiop.jar which is copied into the modules directory
in a GF install. I have no idea how this gets set up for the surefire
tests in glassfish-naming: there can't be a
full GF install for the surefire tests, since the entire GF distribution
hasn't been built yet when the tests are
run.


Ken.