Just some crazy thought: do you think that a getClassLoader() method (to 
provide the ClassLoader to use when proxying) onĀ 
javax.enterprise.inject.spi.Bean could help solve that kind of problem? It 
could default to getBeanClass().getClassLoader().

----------------------------------------
> From: [email protected]
> To: [email protected]
> Subject: RE: NPE when creating a bean through Extension and not through 
> Producer
> Date: Tue, 16 Feb 2016 08:48:25 +0100
>
> Ok, thanks for the clarification!
>
> ----------------------------------------
>> From: [email protected]
>> Date: Tue, 16 Feb 2016 08:44:31 +0100
>> Subject: Re: NPE when creating a bean through Extension and not through 
>> Producer
>> To: [email protected]
>>
>> Side note: @CdiExtensions(EmptyExtension.class) = @CdiExtensions({}) =
>> @CdiExtensions normally
>>
>> Difference is the classloader for the producer is the one of the producer
>> instance and not the returned type (JAXContextProducer in your sample)
>>
>>
>>
>>
>> Romain Manni-Bucau
>> @rmannibucau <https://twitter.com/rmannibucau> | Blog
>> <http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> 
>> |
>> LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber
>> <http://www.tomitribe.com>
>>
>> 2016-02-16 8:36 GMT+01:00 Xavier Dury <[email protected]>:
>>
>>> Thanks for your answer,
>>>
>>> I had doubts it had something to do with the proxying of the JAXBContext
>>> but what I don't understand is why the @Produced one does not have this
>>> problem. Are @Produced @ApplicationScoped beans not proxied?
>>>
>>> Xavier
>>>
>>> ----------------------------------------
>>>> From: [email protected]
>>>> Date: Tue, 16 Feb 2016 08:25:06 +0100
>>>> Subject: Re: NPE when creating a bean through Extension and not through
>>> Producer
>>>> To: [email protected]
>>>>
>>>> Hi Xavier,
>>>>
>>>> it comes from the fact you scoped the context (@ApplicationScoped) so
>>>> openwebbeans needs to generate a proxy in the classloader of jaxb which
>>> is
>>>> probably null there - depends where it is so embedded vs tomee can be
>>>> important there.
>>>>
>>>> The workaround is trivial: wrap the context in an ApplicationScoped bean
>>> or
>>>> simply use the producer instance (not the produced one) and create the
>>>> context in @PostConstruct and in the @Produces always return the same
>>>> instance.
>>>>
>>>> This has a nice side effect: it prevents leaks cause classes not
>>> belonging
>>>> in the application and proxied can leak generally cause some of them need
>>>> to be in the same classloader as the proxied class itself cause of java
>>>> rules - whatever container it is.
>>>>
>>>> That said we can get a better exception on openwebbeans. An alternative
>>> fix
>>>> is probably to override ApplicationBoundaryService of openwebbeans in
>>> your
>>>> application (openwebbeans.properties) but this sounds more fragile than
>>> the
>>>> previous workaround which is safe.
>>>>
>>>>
>>>>
>>>> Romain Manni-Bucau
>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog
>>>> <http://rmannibucau.wordpress.com> | Github <
>>> https://github.com/rmannibucau> |
>>>> LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber
>>>> <http://www.tomitribe.com>
>>>>
>>>> 2016-02-16 8:13 GMT+01:00 Xavier Dury <[email protected]>:
>>>>
>>>>> Hi Romain,
>>>>>
>>>>> You can find my code at https://github.com/kalgon/jaxb-cdi-test
>>>>>
>>>>> I've stripped my extension down to the minimum (I removed the scanning
>>> and
>>>>> I am just instantiating an empty JAXBContext).
>>>>>
>>>>> It seems that OWB wants to use the JAXBContext ClassLoader (which is
>>> null).
>>>>>
>>>>> The problem could also come from an incorrect use of the BeanBuilder
>>> (but
>>>>> that extension works well in wildfly, it only fails in my tests with
>>>>> OpenEJB).
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Xavier
>>>>>
>>>>> ----------------------------------------
>>>>>> From: [email protected]
>>>>>> Date: Mon, 15 Feb 2016 17:36:17 +0100
>>>>>> Subject: Re: NPE when creating a bean through Extension and not through
>>>>> Producer
>>>>>> To: [email protected]
>>>>>>
>>>>>> Hi Xavier,
>>>>>>
>>>>>> do you have some code to share - hope google didnt eat any snippet
>>> again?
>>>>>>
>>>>>>
>>>>>> Romain Manni-Bucau
>>>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog
>>>>>> <http://rmannibucau.wordpress.com> | Github <
>>>>> https://github.com/rmannibucau> |
>>>>>> LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber
>>>>>> <http://www.tomitribe.com>
>>>>>>
>>>>>> 2016-02-15 16:47 GMT+01:00 Xavier Dury <[email protected]>:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> I have written a CDI custom extension (with deltaspike BeanBuilder) to
>>>>>>> scan all types annotated with @XmlRegistry and create one
>>>>>>> @ApplicationScoped JAXBContext for my application.
>>>>>>>
>>>>>>> But beans referencing/injecting that JAXBContext give a NPE when
>>>>> created:
>>>>>>>
>>>>>>> java.lang.NullPointerException
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.proxy.AbstractProxyFactory.defineAndLoadClass(AbstractProxyFactory.java:329)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.proxy.AbstractProxyFactory.createProxyClass(AbstractProxyFactory.java:240)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.proxy.AbstractProxyFactory.createProxyClass(AbstractProxyFactory.java:214)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.proxy.NormalScopeProxyFactory.createProxyClass(NormalScopeProxyFactory.java:269)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.proxy.NormalScopeProxyFactory.createProxyClass(NormalScopeProxyFactory.java:200)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.proxy.NormalScopeProxyFactory.createNormalScopeProxy(NormalScopeProxyFactory.java:149)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.container.BeanManagerImpl.getReference(BeanManagerImpl.java:767)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.container.BeanManagerImpl.getInjectableReference(BeanManagerImpl.java:668)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.inject.AbstractInjectable.inject(AbstractInjectable.java:103)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.inject.InjectableField.doInjection(InjectableField.java:65)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.portable.InjectionTargetImpl.injectFields(InjectionTargetImpl.java:220)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.portable.InjectionTargetImpl.inject(InjectionTargetImpl.java:206)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.webbeans.portable.InjectionTargetImpl.inject(InjectionTargetImpl.java:196)
>>>>>>> at org.apache.webbeans.inject.OWBInjector.inject(OWBInjector.java:56)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.openejb.testing.ApplicationComposers.enrich(ApplicationComposers.java:949)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.openejb.testing.ApplicationComposers.deployApp(ApplicationComposers.java:729)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.openejb.testing.ApplicationComposers.before(ApplicationComposers.java:383)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.openejb.testing.ApplicationComposers.evaluate(ApplicationComposers.java:1060)
>>>>>>> at
>>>>>>>
>>>>>
>>> org.apache.openejb.junit.DeployApplication.evaluate(DeployApplication.java:40)
>>>>>>>
>>>>>>> The weird part is that when I create a JAXBContext through a
>>> Producer, I
>>>>>>> don't have this error.
>>>>>>>
>>>>>>> I have written 2 test cases with ApplicationComposer (one which
>>> creates
>>>>>>> the JAXBContext through @Produces and the other through an extension)
>>>>> but I
>>>>>>> don't know where to report this error as the problem seems to come
>>> from
>>>>>>> openwebbeans but I am using deltaspike and openejb to reproduce it.
>>>>>>>
>>>>>>> Hopefully, some people on this mailing list are members of the 3
>>>>> projects
>>>>>>> ;-)
>>>>>>>
>>>>>>> Xavier
>>>>>>>
>>>>>
>>>>>
>>>
>>>
>
                                          

Reply via email to