dev@glassfish.java.net

Re: Debugging Dependency Injection in GlassFish

From: Jerome Dochez <jerome.dochez_at_oracle.com>
Date: Tue, 4 Jan 2011 12:35:18 -0800

well, no because it's not necessarily an error for HK2 that you request an object that is not available through APIs.
as for the object not being there, if the jar is not on the class-path, I am not sure what hk2 can do.

Injection will always fail unless @Inject(optional=true) is used so what you are describing does not seem possible to me unless we have had a big regression in hk2.

do you have a reproducible test case ?

On Jan 4, 2011, at 12:00 PM, Tim Quinn wrote:

> 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.
>>
>