Hey guys, So I have been looking around to understand how the activation around CDI is worked out by others, including ConfigResolver and Jersey. Here is what I have discovered so far.
#1. Deltaspike. Uses own ConfigResolver approach: among other things, allows to deactivate beans / extensions using a list of config sources. Because Deltaspike is pure CDI, all extensions are automatically discovered but could be deactivated by means of ConfigResolver. In case of CXF, we could take a similar approach by activating the necessary beans (as most of our components are non-beans archives and as such, won't be discovered by CDI), f.e.: <full.class.name>.active = true <full.class.name>.active = true <full.class.name>.active = true Once the JAXRS extension is picked up by CDI runtime, it would add annotated types during the discovery phase for activated providers / features. In the future, this could be done using beans.xml (https://issues.jboss.org/browse/CDI-526), hopefully, but as Romain pointed out, it is problematic at the moment. We could make it per-module (so each component would provide such configuration) or bundle as a single module (f.e. cxf-cdi-discovery, or cxf-cdi-beans, ...). Surely, each application would be able to override any of the activations and/or provide its own if necessary. #2. Jersey. Uses own mechanism to autodiscover and register features and providers. Essentially, in a simplified form, it could be summarized like this. Each module (component) provides binding (in a form contract -> class -> scope) which it thinks should be autodiscovered by the runtime (in this case, CDI). The bindings are brought into context using service loader. In this case, every component has a compile-time dependency on CDI API. No doubts, there are more options available. Picking between the ones above, could/should we implement #1? If yes, should we build it on top of Microprofile Config API (https://github.com/eclipse/microprofile-config)? Or just keep it as simple as possible (around new/use existing property file)? What do you think guys? Thanks. Best Regards, Andriy Redko RMB> Something like deltaspike where it is on by default and deactivable by config is not bad for such modules. Issue RMB> is: what is config? For spring it is obvious but for cdi it must be the 2 mentionned solution and maybe a 3rd fallback with a cxf specific solution - or system props. RMB> An alternate more advanced option can be a cxf-autoload module which would read some classpath file like a spi RMB> where cxf modules could register such feature but would be on only when this module is in the cp. Maybe something RMB> to study but to be honest i believe more in the previous integrations (as a user). RMB> Le 23 déc. 2017 20:29, "Sergey Beryozkin" <sberyoz...@gmail.com> a écrit : RMB> Well, was not clear what you meant, the whole conversation was about optionally choosing whether to auto-load a RMB> given provider or not with CDI and you referred to SpringBoot which could do some magic and CXF having the related RMB> module and possibly getting some ideas from there and I thought I'd clarify that there was no magic there in the RMB> Spring-Boot starters/auto-configuration, nothing SpringBoot or Spring specific (well we do refer to Spring to scan RMB> but CDI can scan too) about optionally loading specific providers from the specific packages. RMB> CXF itself ships many providers in different modules and packages and it is hard to see how one can let users RMB> control auto-loading them (which is) without letting users choose at the config time... RMB> Cheers, Sergey RMB> On 22/12/17 23:15, Andriy Redko wrote: RMB> That is right, I was not refering to autodiscovery but Spring Boot module we RMB> have. As per my understading, CDI has different means for achieving the desired RMB> outcomes but Spring is more flexible in this regard. SB>> CXF SpringBoot module does not do any auto-discovery. The code is in the SB>> rt/frontend/jaxrs/.../spring which can be loaded by the spring boot SB>> module, and it does what I said in the prev email, scans for the classes SB>> annotated as providers in the user-requested packages... SB>> Cheers, Sergey SB>> On 22/12/17 22:40, Andriy Redko wrote: RMB> Documenting make sense. To project it to Spring-based runtime, fe, without RMB> Spring-specific annotations + configuration the discovery won't happen ... RMB> But there is Spring Boot which could do magic here, and CXF does have a RMB> module for it. Same, in theory, could be possible with CXF+CDI (let say by RMB> adding `cxf-cdi` module where we could supply the limited, handcrafted RMB> set of CDI beans available for discovery in the beans.xml). Do you think it RMB> is worth exploring the idea? RMB> Best Regards, RMB> Andriy Redko JDA>> I would do nothing but document a strategy that users can implement. The JDA>> biggest question I have is whether a provider like this should be JDA>> registered automatically? Does that happen with spring based runtimes? JDA>> What about when there is no DI framework present? Is it clear enough that JDA>> user would need to list it in their Application class as a singleton/class? JDA>> John JDA>> On Fri, Dec 22, 2017 at 5:08 PM Andriy Redko <drr...@gmail.com> wrote: RMB> Sure, removed/reverted. So here are the general thoughts. Yes, most (if RMB> not all) of the providers/features/... are not CDI RMB> specific and as such, they are not bean archives (and it make sense). Now, RMB> how could we make the CXF more CDIish? There RMB> are a couple of option we could explore, but what would be the idiomatic RMB> CDI way? RMB> Best Regards, RMB> Andriy Redko JDA>> Personally, I would actually recommend removing the beans.xml from RMB> open tracing (and really any module that isn't JDA>> a cdi specific module). While it does allow for a bit more automatic RMB> binding, my question was more around what is JDA>> missing. I missed the fact that there is no build in automatic RMB> discovery of providers in CDI if they're not CDI JDA>> managed - which is OK and the answer I was working through. JDA>> And realistically, this issue is not specific to the open tracing RMB> integration, I can replicate it with other JDA>> providers. Its just a matter of documenting and knowing what to RMB> setup. JDA>> So if you don't mind, I'd like to revert that commit; and add some RMB> docs around how to create an automatically registered provider. JDA>> John JDA>> On 2017-12-22 15:24, Romain Manni-Bucau <rmannibu...@gmail.com> RMB> wrote: RMB> How can i disable it now? Tink that cxf feature - even if in separate RMB> modules - shouldnt be auto registered until it has a deactivable flag - RMB> classpath properties + overridable through system prop. RMB> Wdyt? RMB> Le 22 déc. 2017 18:38, "Andriy Redko" <drr...@gmail.com> a écrit : RMB> Hi Sergey, RMB> It wasn't (for CDI only), but it could have been always included RMB> manually. RMB> Thanks. RMB> Best Regards, RMB> Andriy Redko SB>> Hi Andriy SB>> So how was a JAX-RS (OpenTracing) Feature discovered without RMB> beans.xml RMB> ? SB>> Cheers, Sergey SB>> On 22/12/17 17:24, Andriy Redko wrote: RMB> The beans.xml was missed indeed, I added it and OpenTracingFeature RMB> has RMB> been discovered right away. RMB> The commit is on its way. Thanks! RMB> Best Regards, RMB> Andriy Redko JDA>> I'm holding off on doing anything to fix it. For one, a user RMB> may RMB> not want to use the global tracer so making it JDA>> so that they register it makes more sense. Ultimately to RMB> solve RMB> it, I think we should be moving server JDA>> customizations outside of CDI to ensure that it can be auto RMB> registered. JDA>> John JDA>> On Fri, Dec 22, 2017 at 11:12 AM Andriy Redko < RMB> wrote: JDA>> Hey John, JDA>> The OpenTracingFeature RMB> (org.apache.cxf.tracing.opentracing.jaxrs RMB> package) is JAX-RS feature, JDA>> which JAXRS CDI extension should recognize out of the box. RMB> There RMB> is also CXF feature ( JDA>> in org.apache.cxf.tracing.opentracing package) to be used for RMB> JAX-WS services. The only explanation JDA>> I have why it is not being picked up it the absense of RMB> bean.xml RMB> so we could fix that. I will JDA>> take a look shorly (if you haven't figured this one out RMB> already). RMB> Thanks. JDA>> Best Regards, JDA>> Andriy Redko RMB> JDA>> I'm not sure either, this is the behavior I see in the RMB> code: RMB> JDA>> - Register JAX-RS resources (with @ApplicationPath) RMB> JDA>> - Register JAX-RS resources (with @Path) RMB> JDA>> - Register JAX-RS providers (with JAX-RS @Provider) RMB> JDA>> - Register JAX-RS features (with JAX-RS @Feature) RMB> JDA>> - Register CXF features (doesn't care if it has a CXF RMB> @Provider RMB> annotation but I see the OpenTracing one does have it) RMB> JDA>> - Otherwise we assume its the CXF Bus object RMB> JDA>> There's not much happening with a CXF @Provider RMB> declaration in RMB> the extension. But at the end of the day, I'm only RMB> JDA>> dealing with a JAX-RS @Provider and that doesn't get RMB> registered RMB> since it's not a CDI bean. I don't see any issue RMB> JDA>> registering CXF @Provider this way as well, but its RMB> possible RMB> it's not a CDI bean still, but that's ultimately what the customizer RMB> was RMB> put in for. RMB> JDA>> John RMB> JDA>> On 2017-12-22 09:56, Sergey Beryozkin < RMB> sberyoz...@gmail.com> RMB> wrote: RMB> >>> Sure, I just don't understand what is the difference between RMB> a RMB> JAX-RS RMB> >>> feature and CXF feature, as far as the CXF CDI code is RMB> concerned. RMB> If it RMB> >>> can load the JAX-RS features which have not been written RMB> with CDI RMB> in RMB> >>> mind, why can't it load CXF features without some extra work RMB> going into RMB> >>> these features... RMB> >>> Thanks, Sergey RMB> >>> On 22/12/17 14:50, John D. Ament wrote: RMB> >>> > That's not really the issue though. The extension will RMB> only RMB> receive CDI managed beans. Take a look at my pull to see what I had RMB> to do RMB> to get it to register automatically. If nothing else, this is an RMB> argument RMB> for moving JAXRSServer Customization into core and using service RMB> loader RMB> :-) Perhaps after the new year. RMB> >>> > RMB> >>> > On 2017-12-22 09:23, Sergey Beryozkin < RMB> sberyoz...@gmail.com> RMB> wrote: RMB> >>> >> I was not referring the OpenTracing module offering a CDI RMB> extension, but RMB> >>> >> to the work Andriy did in the CXF CDI integration where RMB> the RMB> providers RMB> >>> >> and feature are picked up. Thought, when we were RMB> discussing RMB> the SSE RMB> >>> >> feature I thought Andriy said it was looking at the CXF RMB> @Provider as RMB> >>> >> well, may be I misunderstood. RMB> >>> >> Updating the CDI code to check CXF @Provider, if it is not RMB> already RMB> >>> >> checked, makes sense IMHO RMB> >>> >> RMB> >>> >> Sergey RMB> >>> >> On 22/12/17 14:08, John D. Ament wrote: RMB> >>> >>> Actually one more thing. The CDI extension only looks RMB> for RMB> JAX-RS @Provider not CXF @Provider. RMB> >>> >>> RMB> >>> >>> On 2017-12-22 09:06, "John D. Ament"< RMB> johndam...@apache.org> RMB> wrote: RMB> >>> >>>> I'm not sure what the CDI extension has to do with RMB> this. It RMB> has no bean defining annotations, and there is no beans.xml in the RMB> JAR that RMB> it ships with so I'm not sure it would be picked up by the extension. RMB> >>> >>>> RMB> >>> >>>> There's nothing special done for TomcatwarTest to make RMB> more RMB> JARs available, right? RMB> >>> >>>> RMB> >>> >>>> On 2017-12-22 08:15, Sergey Beryozkin < RMB> sberyoz...@gmail.com> RMB> wrote: RMB> >>> >>>>> It is annotated with CXF @Provider annotation - should RMB> be RMB> picked up by RMB> >>> >>>>> the CXF CDI extension RMB> >>> >>>>> RMB> >>> >>>>> Sergey RMB> >>> >>>>> On 22/12/17 13:07, John D. Ament wrote: RMB> >>> >>>>>> I'm trying to finish up testing CDI injection of RMB> Context RMB> objects. The one RMB> >>> >>>>>> area I'm struggling with is the automatic RMB> registration of RMB> this feature. I RMB> >>> >>>>>> added a dependency on OpenTracing, just to confirm RMB> that RMB> injection via CDI RMB> >>> >>>>>> works (and to be honest, this is one of my use cases, RMB> working with RMB> >>> >>>>>> tracing). However, it seems that this feature isn't RMB> automatically RMB> >>> >>>>>> registered via CDI. Is there something I have to do RMB> to RMB> make it work? RMB> >>> >>>>>> RMB> >>> >>>>>> John RMB> >>> >>>>>> RMB> >>> >>>>> RMB> >>> >>>> RMB> >>> >>