I forgot to mention that the Tomcat stack trace I posted earlier is from
Tomcat 9.0.62. The change in behavior was observed starting Tomcat 9.0.60


On Tue, Apr 5, 2022 at 10:01 AM Cherio <che...@gmail.com> 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.
>
> 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
> 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 <p.ra...@gmx.net> 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" <che...@gmail.com>
>> An: users@tomcat.apache.org
>> 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: users-unsubscr...@tomcat.apache.org
>> For additional commands, e-mail: users-h...@tomcat.apache.org
>>
>>

Reply via email to