Yesterday evening i was able to bootstrap the filter and an application through ARC CDI and render the home page (without any services to inject).
Lying in bed I thought that it might be possible to create a ComponentInstantiationListener that gets an injected Instance of eg ApplicationScoped beans, from which the listener selects the required injectable beans and injects those into the components just as wicket-cdi does now. Issue with that is the build time scanner of ARC that hunts for injections and will create errors Martijn Become a Wicket expert, learn from the best: http://wicketinaction.com On Wed, 23 Apr 2025 at 21:09, Martijn Dashorst <martijn.dasho...@gmail.com> wrote: > After some soul searching for a while I might have a workable idea for > using Quarkus CDI and Wicket, which is probably the biggest hold back for > using these technologies together. > > I've put my thoughts in this JIRA ticket in the last comment: > https://issues.apache.org/jira/browse/WICKET-6917?focusedCommentId=17946818&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-17946818 > > I'll also paste my comment here: > > The issue is that ARC (the cdi implementation behind quarkus) doesn't > support and isn't going to support non-contextual injections as it wants to > resolve injections at build time rather than deploy- and runtime. Wicket's > basic premise is that it is a non-managed framework where you are allowed > to new your components and behaviors and models at will, which all escape > the management of a CDI container. > > I'm thinking about this a bit for a while, and I figure that it might be > possible to provide some form of integration if we limit some constructs > that are now available for Wicket developers. > > First we need to make pages managed, and the restored state of pages > managed when they are retrieved from the page store. This is probably > fairly easy to build using a `@SessionScoped` CDI producer that retrieves > pages either from a factory or from the pagestore if there's state > available (i.e. there's a pageid in the request). This also means that you > are no longer allowed to instantiate pages yourself, but that they must > have a default constructor, a pageparameters constructor or a > mapper/factory that can instantiate the page based on the provided URL. > This allows CDI to perform its injections on the retrieved instance(s). I'm > sure this would work for instantiating new pages. I'm not so sure about > retrieving pages from the page store and getting those managed again (about > 90% hopeful that it works). This should also work with injected services in > the page instances, but not general component instances. > > Next we need a way to make Panels injectable with CDI beans. This is a > hairy one. For now the only way I can foresee this working is to have an > Instance<MyPanel> field in your page and get an instance from that to add > to the page's component hierarchy. I'm open to other suggestions. > > As for scoping, I'm not 100% sure, but using the @RequestScope for the > page producers and panel instances might just work. We might need our own > scope, but I wouldn't know how that differs from the request scope for our > purposes. > Injection into behaviors and models is something that either needs to go > through the Instance<Behavior> / Instance<FooModel> route or using producer > methods. My guess is that it is probably easier to use constructor > parameters and use the page/panel injected beans as parameters to the > models/behaviors. > > This is all without providing any integration libraries such as a "Wicket > Arc" that would plug into arc for our purposes. It might be possible to do > all the above automatically given the right integration, but I'm not an arc > knower, nor a CDI implementation builder. > > What do y'all think? > > Martijn >