dev@glassfish.java.net

Re: Debugging Dependency Injection in GlassFish

From: Tim Quinn <tim.quinn_at_oracle.com>
Date: Tue, 4 Jan 2011 14:00:50 -0600

Is there logging or a debug flag that hk2 can use for this sort of
investigation?

I ran into maybe a similar problem. I was testing after removing some
ACC dependencies (trying to reduce the ACC footprint). Compilation
worked but at runtime I got an NPE because an object was not
injected. I expect the injection failed because the class being
injected depended on classes that were no longer available thanks to
the removed dependencies, but I saw no error messages or exceptions
from hk2.

Thanks.

- Tim

On Jan 4, 2011, at 1:38 PM, Jerome Dochez wrote:

> is there a dependency on this orb/orb-iiop module with <test> scope
> in the pom.xml ?
>
> if u do a mvn -X, it will tell you the list of jars used to run
> tests (yes the output is very prolific)
> it's most likely not in that list.
>
> On Jan 4, 2011, at 11:03 AM, Ken wrote:
>
>> 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.
>