Hi,

On Thu, Jul 26, 2018 at 2:57 AM, Christopher Schultz
<ch...@christopherschultz.net> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
>
> Huxing,
>
> On 7/25/18 11:28 AM, Huxing Zhang wrote:
>> Hi,
>>
>> Recently I am working on implementing a feature that can
>> automatically register a ServletContextListerner instance, say A,
>> to servletContext programmatically during startup.
>>
>> I use ServletContainerInitializer and call the
>> servletContext.addListener() method. This is fine for most of the
>> cases. But if user has specified A in web.xml, it turns that A will
>> be registered twice, which will lead to undesired behavior.
>>
>> My expected behavior will be registering A only once regardless of
>> user specified A in web.xml or not.
>>
>> I can achieve this by specifying A in web-fragment.xml, since it
>> will get merged into web.xml whenever A is defined in web.xml or
>> not, which means duplicates can be removed.
>>
>> I am wondering why we can not achieve this using programatic API.
>>
>> I've checked servlet 4.0/3.1 spec, in 4.4.3.1 "void
>> addListener(String className)", it says:
>>
>> If the class with the given name implements a listener interface
>> whose invocation order corresponds to the declaration order, that
>> is, if it implements javax.servlet.ServletRequestListener,
>> javax.servlet.ServletContextListener or
>> javax.servlet.http.HttpSessionListener, then the new listener will
>> be added to the end of the ordered list of listeners of that
>> interface.
>>
>> It looks tomcat's behavior is spec-compliant.
>>
>> My idea is if I can get all the existing listeners from
>> servletContext, then I can decide whether to add A or not.
>>
>> But I can't find that kind of API from servletContext.
>>
>> I also noticed that there are getServletRegistrations() and
>> getFilterRegistrations() in servletContext, why can't we have API
>> like getListeners()?
>
> Can you think of a use-case where addListener() shouldn't
> automatically perform de-duplication?

No, I can't think of that case.

If there is really a case, I think we can use
javax.servlet.ServletContext#setInitParameter to control that
behavior.
For example, use a initialization parameter named
DEDUPLICATE_LISTENERS, if set to true, any further registration will
be de-duplicated.
This parameter is better to be a per call parameter rather than a
global parameter, because it might be updated from multiple place.

Overall, I don't  think it is necessary to have unless there is a case.

> I'm thinking that Tomcat should
> simply take a call to addListener() and ignore any registrations after
> the first one.

Yes, I think it is important to have consistent behavior between
web-fragement/@WebListener and programmatic API.

>
> Would that make sense? Would it violate any spec-defined behavior?

I can't find any spec describing how to handle the duplications on
that part, so I guess it is safe to do so. :)

Maybe we can improve spec as well.

>
> - -chris
> -----BEGIN PGP SIGNATURE-----
> Comment: GPGTools - http://gpgtools.org
> Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
>
> iQIzBAEBCAAdFiEEMmKgYcQvxMe7tcJcHPApP6U8pFgFAltYyDIACgkQHPApP6U8
> pFhSmA//We21JrL+KwpbPrNgicIM0T77/WFMQyNoaFrW0+QdJ96CUAWYr6NKn17t
> 0Y0mk9WpRDSIsknpXPTYfisO1RllO7Mde1KuGH6EUMZyYWr84E9YhqBVyOHG48if
> Y/COneCHK3Gs7QlywgRhyKDZFogDFS/X5zW+AGctFIdcdgBu0z8U85a/wlPLUTuk
> XA00qPLrIWSXerB97nsqcdreh7Qs2Uyx3Eye74JE4RwzRYkGVYrMuPpPQwudbAUF
> f2fgAHC5lrJBGLK4yiFce53KcwTzeyBM2yskux/1y02NUyHIASpjV8DqADthV61o
> SOFgG25PJChShsLQipjhcNQtqiluP4FNo1sN78ieMABfOm1zlIh4T4/4M8VD0MqP
> qdoXgqC8vEsCiGUY7rqQKIRTAe6Hpf2yz6Oygwhfk+6z2CpJ4RQfsAFMVJMf2KOM
> wjb6akXnrEzxPG6UEVxtep2cLLVraHlbjDHzNqMrecBC2EYHU/Ovh+gpsHXtJG8v
> +Koh9HR2Ps5h92PI5ND39JsD1KyNhO+zayYD/a+I9ryrQEKV584JyU6q3vyWIwXk
> m8eDlYo0ChCeiGwQ22bAOsdKYTJHruGPEg92VbbDipPLJ+8uzAbtEAlXmiGYkv2B
> Q3EtprVkD1sI88v/iRU8QZg7ux5ebKDHGIk1f33BP3AYUWnwcyY=
> =jKMW
> -----END PGP SIGNATURE-----
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: dev-h...@tomcat.apache.org
>



-- 
Best Regards!
Huxing

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to