Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Boot-Embedded Tomcat-@WebListener,由@ServletComponentScan扫描,添加一个过滤器并获取java.lang.UnsupportedOperationException_Spring_Spring Boot_Tomcat8_Servlet 3.0 - Fatal编程技术网

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方式”使用它并完成吗?