Browse Source
Previously, @WebListeners were discovered via custom component scanning and then registered programmatically via the ServletContext. The servlet spec requires any ServletContextListener registered in this manner to be prohibited from programatically configuring servlets, filters, and listeners. This left us not strictly complying with the servlet spec as a ServletContextListener registered via a @WebListener annotation should be able to programatically configure other components. This commit updates WebListenerHandler to register each @WebListener component directly with Jetty, Tomcat, or Undertow rather than via the ServletContext API. This ensure that any @WebListener-annoated ServletContextListener registered via servlet component scanning is able to programatically register servlets, filters, and listeners. There is a small chance that this will be a breaking change for some users: 1. The ServletListenerRegistrationBeans that were previously defined for each @WebListener will now be WebListenerHandler.WebListenerRegistrars 2. Each @WebListener-annotated class will now be instantiated by Jetty, Tomcat, or Undertow. Jetty and Tomcat both require the class to be public and have a public default constructor. Previously, a package-private class or default constructor could be used as the instantiation was performed by Spring Framework. Undertow is not affected as it can instantiate a package-private type. Fixes gh-18303pull/23914/head
14 changed files with 289 additions and 32 deletions
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
/* |
||||
* Copyright 2012-2020 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.boot.web.servlet; |
||||
|
||||
import javax.servlet.annotation.WebListener; |
||||
|
||||
/** |
||||
* Interface to be implemented by types that register {@link WebListener @WebListeners}. |
||||
* |
||||
* @author Andy Wilkinson |
||||
* @since 2.4.0 |
||||
*/ |
||||
public interface WebListenerRegistrar { |
||||
|
||||
/** |
||||
* Register web listeners with the given registry. |
||||
* @param registry the web listener registry |
||||
*/ |
||||
void register(WebListenerRegistry registry); |
||||
|
||||
} |
||||
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
/* |
||||
* Copyright 2012-2020 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.boot.web.servlet; |
||||
|
||||
import javax.servlet.annotation.WebListener; |
||||
|
||||
/** |
||||
* A registry that holds {@link WebListener @WebListeners}. |
||||
* |
||||
* @author Andy Wilkinson |
||||
* @since 2.4.0 |
||||
*/ |
||||
public interface WebListenerRegistry { |
||||
|
||||
/** |
||||
* Adds web listeners that will be registered with the servlet container. |
||||
* @param webListenerClassNames the class names of the web listeners |
||||
*/ |
||||
void addWebListeners(String... webListenerClassNames); |
||||
|
||||
} |
||||
Loading…
Reference in new issue