> -----Ursprüngliche Nachricht-----
> Von: Cherio <che...@gmail.com>
> Gesendet: Dienstag, 5. April 2022 17:17
> An: Tomcat Users List <users@tomcat.apache.org>
> Betreff: Re: PostConstruct annotation in a filter since version 9.0.60
> 
> I did ran the diffs between versions. With my naked eye I didn't spot
> anything obvious that in my mind would be directly related to this behavior
> change.
> 
> At the same time, when I toggle between the above mentioned Tomcat
> versions the exact same application either starts successfully or fails on
> PostConstruct.
> 
> I am not stating this is a bug. It may or may not be one. Maybe it IS supposed
> to process PostConstruct on filters (and maybe even other classes and
> objects??)  I can't classify it as a regression or a fix because I can't find 
> a clear
> description of how this should behave.
> 
> On Tue, Apr 5, 2022 at 10:42 AM Rémy Maucherat <r...@apache.org>
> wrote:
> 
> > On Tue, Apr 5, 2022 at 4:02 PM 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/apa
> > che-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(DispatcherTyp
> > e.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(Defa
> > ultInstanceManager.java:693)
> > > at
> > >
> >
> org.apache.catalina.core.DefaultInstanceManager.populateAnnotationsCac
> > he(DefaultInstanceManager.java:370)
> > > at
> > >
> > org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultIns
> > tanceManager.java:172)
> > > at
> > >
> > org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultIns
> > tanceManager.java:165)
> > > at
> > >
> > org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFil
> > terConfig.java:105)
> > > at
> > >
> > org.apache.catalina.core.StandardContext.filterStart(StandardContext.j
> > ava: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.j
> > ava:1396)
> > > at
> > >
> > org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.j
> > ava:1386)
> > > at
> > > java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
> > > at
> > >
> > org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExe
> > cutorService.java:75)
> > > at
> > >
> > java.base/java.util.concurrent.AbstractExecutorService.submit(Abstract
> > ExecutorService.java:145)
> > > at
> > >
> > org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.jav
> > a: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.j
> > ava:1396)
> > > at
> > >
> > org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.j
> > ava:1386)
> > > at
> > > java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
> > > at
> > >
> > org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExe
> > cutorService.java:75)
> > > at
> > >
> > java.base/java.util.concurrent.AbstractExecutorService.submit(Abstract
> > ExecutorService.java:145)
> > > at
> > >
> > org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.jav
> > a:919)
> > > at
> > >
> > org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.j
> > ava: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.j
> > ava: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(Nati
> > > ve
> > > Method)
> > > at
> > >
> > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeM
> > ethodAccessorImpl.java:77)
> > > at
> > >
> > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Del
> > egatingMethodAccessorImpl.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!
> > > >

Hello,

how does your method in the filter class look like?
The requirements of your methods signature are checked here: 
https://github.com/apache/tomcat/blob/9.0.x/java/org/apache/catalina/util/Introspection.java
 line 83ff

Does your method meet these criteria?

Not sure if the error message is helpful because it seems that not the 
annotation but the method signature is checked (Parameter 0, not static, no 
exception, void)

Greetings,
Thomas

Reply via email to