Spring Boot-Embedded Tomcat-@WebListener,由@ServletComponentScan扫描,添加一个过滤器并获取java.lang.UnsupportedOperationException
假设我们可以使用Spring Boot-Embedded Tomcat-@WebListener,由@ServletComponentScan扫描,添加一个过滤器并获取java.lang.UnsupportedOperationException,spring,spring-boot,tomcat8,servlet-3.0,Spring,Spring Boot,Tomcat8,Servlet 3.0,假设我们可以使用@ServletComponentScan添加带有@WebListener、@WebFilter等注释的标准servlet组件 在我的例子中,我有一个动态添加过滤器的@WebListener: @WebListener public class FilterConfigurerListener implements ServletContextListener{ @Override public void contextInitialized(ServletCo
@ServletComponentScan
添加带有@WebListener
、@WebFilter
等注释的标准servlet组件
在我的例子中,我有一个动态添加过滤器的@WebListener
:
@WebListener
public class FilterConfigurerListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
try{
...
ServletContext sc = sce.getServletContext();
Dynamic rcf = sc.addFilter("myFilter", MyFilter.class);
@Override
public javax.servlet.FilterRegistration.Dynamic addFilter(
String filterName, Class<? extends Filter> filterClass) {
throw new UnsupportedOperationException(
sm.getString("noPluggabilityServletContext.notAllowed"));
}
addFilter()
调用引发以下异常:
java.lang.UnsupportedOperationException: Section 4.4 of the Servlet 3.0 specification does not permit this method to be called from a ServletContextListener that was not defined in web.xml, a web-fragment.xml file nor annotated with @WebListener
at org.apache.catalina.core.StandardContext$NoPluggabilityServletContext.addFilter(StandardContext.java:6639)
at com.whatever.FilterConfigurerListener.contextInitialized(FilterConfigurerListener.java:44)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4743)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5207)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
我的Spring Boot应用程序的注释如文档中所述:
@ServletComponentScan(basePackageClasses=FilterConfigurerListener.class)
@SpringBootApplication
public class MySpringBootApplication {
查看一下org.apache.catalina.core.StandardContext
,我可以看到此实现不允许添加过滤器:
@WebListener
public class FilterConfigurerListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
try{
...
ServletContext sc = sce.getServletContext();
Dynamic rcf = sc.addFilter("myFilter", MyFilter.class);
@Override
public javax.servlet.FilterRegistration.Dynamic addFilter(
String filterName, Class<? extends Filter> filterClass) {
throw new UnsupportedOperationException(
sm.getString("noPluggabilityServletContext.notAllowed"));
}
@覆盖
public javax.servlet.FilterRegistration.Dynamic addFilter(
String filterName,Class为什么不在您的Spring Boot应用程序中作为bean添加过滤器呢?因为FilterConfigurerListener
包含一些可重用的逻辑。它是Spring Boot应用程序和普通JEE应用程序中都使用的库的一部分。我怀疑自动检测不会起作用,您可能会EmbeddedServletContainerCustomizer
将其添加到容器中,而不是自动检测它。您可能需要将其包装在ServletContainerInitializer
中以执行它。对于您的spring应用程序,可以扩展FilterConfigurerListener
,以便以“spring方式”使用它并完成吗?