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