On Tue, Apr 5, 2022 at 4:02 PM Cherio <[email protected]> wrote: > > Yes, I confirm. For this project I download Tomcat from here: > https://archive.apache.org/dist/tomcat/tomcat-$MAJOR_VER/v$VER/bin/apache-tomcat-$VER.tar.gz > > BTW @PostConstruct doesn't have to do with dependency injection. It is > about lifecycle processing. > > The change in behavior was narrowed down to switching versions from 9.0.59 > to 9.0.60.
Thanks to the effort to isolate the problem, but this is not likely: https://github.com/apache/tomcat/compare/9.0.59...9.0.60 No relevant changes, so Tomcat's annotation scanning behavior won't change. The DefaultInstanceManager is used, it seems it wasn't used before then. Since you're using Spring, maybe the problem could come from there ? > > The code that adds the filter is super simple: > > FilterRegistration.Dynamic filterName = > servletContext.addFilter(FILTER_NAME, filterObject); > sessionContextFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), > true, "/*"); > > The filter is a Spring an annotated class. in version 9.0.59 and > before @PostConstruct was only handled by Spring. Starting with version > 9.0.60, Tomcat attempts to handle PostConstruct. It produces an exception > (see below) and fails to start the application. > > 12:34:56.789 ERROR o.a.c.c.C.[.[.[/project-name] - Exception starting > filter [filterName] > java.lang.IllegalArgumentException: Invalid javax.annotation.PostConstruct Is the error message accurate (= is the annotation target funny ?). I understand that this is supposedly not Tomcat that should process the annotation (if you say so), but PostConstruct is from EE so there's likely a problem. Maybe it "used to work" but maybe that's a good hint too. Rémy > annotation > at > org.apache.catalina.core.DefaultInstanceManager.findLifecycleCallback(DefaultInstanceManager.java:719) > at > org.apache.catalina.core.DefaultInstanceManager.findPostConstruct(DefaultInstanceManager.java:693) > at > org.apache.catalina.core.DefaultInstanceManager.populateAnnotationsCache(DefaultInstanceManager.java:370) > at > org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:172) > at > org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:165) > at > org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105) > at > org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4613) > at > org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5256) > at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) > at > org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) > at > org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) > at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) > at > org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) > at > java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) > at > org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919) > at > org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835) > at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) > at > org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) > at > org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) > at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) > at > org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) > at > java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) > at > org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919) > at > org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:263) > at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) > at > org.apache.catalina.core.StandardService.startInternal(StandardService.java:432) > at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) > at > org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:927) > at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) > at org.apache.catalina.startup.Catalina.start(Catalina.java:772) > at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native > Method) > at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) > at > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.base/java.lang.reflect.Method.invoke(Method.java:568) > at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345) > at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:476) > > > On Sun, Apr 3, 2022 at 9:54 AM Peter Rader <[email protected]> wrote: > > > PostConstruct is for dependency-injection. A vanilla tomcat does no > > dependency injection. Can you confirm you have a vanilla tomcat? > > > > Kind regards > > > > Peter Rader > > -- > > Fachinformatiker AE / IT Software Developer > > Peter Rader > > Wilsnacker Strasse 17 > > 10559 Berlin - GERMANY > > Tel: 0049 (0)30 / 6 29 33 29 6 > > Fax: 0049 (0)30 / 6 29 33 29 6 > > Handy: 0049 (0)176 / 87 521 576 > > Handy: 0049 (0)176 / 47 876 303 > > > > > > > > Gesendet: Freitag, 01. April 2022 um 23:02 Uhr > > Von: "Cherio" <[email protected]> > > An: [email protected] > > Betreff: PostConstruct annotation in a filter since version 9.0.60 > > I observed an announced change in behavior in version 9.0.60 (and later). > > > > My application has a Spring class loaded as a javax.servlet.Filter. It has > > a method annotated with a PostConstruct annotation. Up until Tomcat 9.0.59 > > the annotation was handled by Spring. Starting with Tomcat 9.0.60 behavior > > changed. Now Tomcat attempts to take action on that method. The attempt > > fails with "java.lang.IllegalArgumentException: Invalid > > javax.annotation.PostConstruct annotation" exception and that results in > > the whole application failing to start. > > > > I use PostConstruct in other Spring modules but it looks like Tomcat cares > > only about classes it deals with directly. > > > > I do not see this change documented anywhere so I assume this may be a > > regression or an undocumented bug fix or feature. > > > > Does anyone have more information about this? > > Thanks! > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [email protected] > > For additional commands, e-mail: [email protected] > > > > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
