You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Martin Tzvetanov Grigorov (Jira)" <ji...@apache.org> on 2021/09/30 12:26:00 UTC

[jira] [Commented] (WICKET-6923) Package Private Spring Beans cannot be injected since Wicket 9.5

    [ https://issues.apache.org/jira/browse/WICKET-6923?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17422733#comment-17422733 ] 

Martin Tzvetanov Grigorov commented on WICKET-6923:
---------------------------------------------------

ByteBuddy is not involved in your case. The stack trace says you use CGLib.

We have a unit test for this at [https://github.com/apache/wicket/tree/master/wicket-ioc/src/test/java/org/apache/wicket/proxy/packageprivate.] What kind of change it needs to make if fail ?

> Package Private Spring Beans cannot be injected since Wicket 9.5
> ----------------------------------------------------------------
>
>                 Key: WICKET-6923
>                 URL: https://issues.apache.org/jira/browse/WICKET-6923
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket-ioc, wicket-spring
>    Affects Versions: 9.5.0
>         Environment: JDK 11.0.12, Jetty 9.4.43.v20210629
>            Reporter: felix.rilling@cryptshare.com
>            Priority: Major
>
> In Wicket 9.4.0 using wicket-spring, it is possible to use @SpringBean in a webpage to inject a spring component whose constructor is package private.
> Starting with wicket 9.5.0, the following error is thrown:
> {code:java}
> net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
> 	at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:348)
> 	at net.sf.cglib.proxy.Enhancer.generate(Enhancer.java:492)
> 	at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:96)
> 	at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:94)
> 	at net.sf.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54)
> 	at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
> 	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
> 	at net.sf.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61)
> 	at net.sf.cglib.core.internal.LoadingCache.get(LoadingCache.java:34)
> 	at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:119)
> 	at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:294)
> 	at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:480)
> 	at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:337)
> 	at org.apache.wicket.proxy.cglib.CglibProxyFactory.createProxy(CglibProxyFactory.java:84)
> 	at org.apache.wicket.proxy.LazyInitProxyFactory.createProxy(LazyInitProxyFactory.java:160)
> 	at org.apache.wicket.spring.injection.annot.AnnotProxyFieldValueFactory.getFieldValue(AnnotProxyFieldValueFactory.java:166)
> 	at org.apache.wicket.injection.Injector.inject(Injector.java:111)
> 	at org.apache.wicket.spring.injection.annot.SpringComponentInjector.inject(SpringComponentInjector.java:124)
> 	at org.apache.wicket.spring.injection.annot.SpringComponentInjector.onInstantiation(SpringComponentInjector.java:130)
> 	at org.apache.wicket.application.ComponentInstantiationListenerCollection$1.notify(ComponentInstantiationListenerCollection.java:38)
> 	at org.apache.wicket.application.ComponentInstantiationListenerCollection$1.notify(ComponentInstantiationListenerCollection.java:34)
> 	at org.apache.wicket.util.listener.ListenerCollection.notify(ListenerCollection.java:80)
> 	at org.apache.wicket.application.ComponentInstantiationListenerCollection.onInstantiation(ComponentInstantiationListenerCollection.java:33)
> 	at org.apache.wicket.Component.<init>(Component.java:691)
> 	at org.apache.wicket.MarkupContainer.<init>(MarkupContainer.java:180)
> 	at org.apache.wicket.markup.html.WebMarkupContainer.<init>(WebMarkupContainer.java:53)
> 	at org.apache.wicket.markup.html.panel.Panel.<init>(Panel.java:75)
> 	at org.apache.wicket.markup.html.panel.GenericPanel.<init>(GenericPanel.java:49)
> 	[...].ScreenFizz.<init>(ScreenFizz.java:24)
> 	[...].ScreenFizz.<init>(ScreenFizz.java:20)
> 	[...].ScreenBar.<init>(ScreenBar.java:113)
> 	[...].SomeOtherComponent.prepareScreenBar(SomeOtherComponent.java:584)
> 	[...].SomeOtherComponent.prepareNextScreen(SomeOtherComponent.java:347)
> 	[...].Wicket_Proxy_SomeOtherComponent$$FastClassByCGLIB$$78361ff0.invoke(<generated>)
> 	at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
> 	at org.apache.wicket.proxy.LazyInitProxyFactory$AbstractCGLibInterceptor.intercept(LazyInitProxyFactory.java:318)
> 	[...].Wicket_Proxy_SomeOtherComponent$$EnhancerByCGLIB$$5db7af96.prepareNextScreen(<generated>)
> 	[...].ScreenFoo$2.onAfterSubmit(ScreenFoo.java:63)
> 	at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior$AjaxFormSubmitter.onAfterSubmit(AjaxFormSubmitBehavior.java:255)
> 	at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1355)
> 	at org.apache.wicket.markup.html.form.Form.process(Form.java:1016)
> 	at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:840)
> 	at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior.onEvent(AjaxFormSubmitBehavior.java:202)
> 	at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:146)
> 	at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:630)
> 	at org.apache.wicket.core.request.handler.ListenerRequestHandler.internalInvoke(ListenerRequestHandler.java:306)
> 	at org.apache.wicket.core.request.handler.ListenerRequestHandler.invoke(ListenerRequestHandler.java:280)
> 	at org.apache.wicket.core.request.handler.ListenerRequestHandler.invokeListener(ListenerRequestHandler.java:222)
> 	at org.apache.wicket.core.request.handler.ListenerRequestHandler.respond(ListenerRequestHandler.java:208)
> 	at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:910)
> 	at org.apache.wicket.request.RequestHandlerExecutor.execute(RequestHandlerExecutor.java:63)
> 	at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:294)
> 	at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:255)
> 	at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:277)
> 	at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:208)
> 	at org.apache.wicket.protocol.http.WicketServlet.doPost(WicketServlet.java:159)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:665)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
> 	at org.eclipse.jetty.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1450)
> 	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
> 	at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1626)
> 	[...]FilterBar.doFilter(FilterBar.java:51)
> 	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> 	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> 	[...]FilterFoo.doFilter(FilterFoo.java:40)
> 	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> 	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> 	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:548)
> 	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
> 	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:602)
> 	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
> 	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
> 	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
> 	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
> 	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1434)
> 	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
> 	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
> 	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
> 	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
> 	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349)
> 	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
> 	at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:59)
> 	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
> 	at org.eclipse.jetty.server.Server.handle(Server.java:516)
> 	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388)
> 	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633)
> 	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380)
> 	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
> 	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
> 	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
> 	at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:555)
> 	at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:410)
> 	at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:164)
> 	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
> 	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
> 	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
> 	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
> 	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
> 	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
> 	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:386)
> 	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
> 	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
> 	at java.base/java.lang.Thread.run(Thread.java:829)
> Caused by: java.lang.reflect.InvocationTargetException: null
> 	at java.base/jdk.internal.reflect.GeneratedMethodAccessor94.invoke(Unknown Source)
> 	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
> 	at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:459)
> 	at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:339)
> 	... 102 common frames omitted
> Caused by: java.lang.IllegalAccessError: [...].Wicket_Proxy_SomeComponent$$EnhancerByCGLIB$$8d29d168 cannot access its superclass [...].SomeComponent ([...].Wicket_Proxy_SomeComponent$$EnhancerByCGLIB$$8d29d168 is in unnamed module of loader org.eclipse.jetty.webapp.WebAppClassLoader @10aabada;[...].SomeComponent is in unnamed module of loader 'app')
> 	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
> 	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
> 	... 107 common frames omitted
> {code}
>  changing the component constructor to public works. Note that the webpage and the component are in the same package.
> Possibly introduced by WICKET-6913, possibly a restriction of ByteBuddy? (https://stackoverflow.com/questions/34756496/interceptor-class-visibility-in-byte-buddy)



--
This message was sent by Atlassian Jira
(v8.3.4#803005)