Java 位于org.springframework.security.web.FilterChainProxy.getFilters的NullPointerException

Java 位于org.springframework.security.web.FilterChainProxy.getFilters的NullPointerException,java,spring,spring-mvc,filter,spring-security,Java,Spring,Spring Mvc,Filter,Spring Security,我尝试使用spring安全性,并得到了这个错误 java.lang.NullPointerException at org.springframework.security.web.FilterChainProxy.getFilters(FilterChainProxy.java:223) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:196) at org.

我尝试使用spring安全性,并得到了这个错误

java.lang.NullPointerException
at org.springframework.security.web.FilterChainProxy.getFilters(FilterChainProxy.java:223)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:196)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
我在web.xml中包含过滤器

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<filter>
    <filter-name>encoding-filter</filter-name>
    <filter-class>
        org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encoding-filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

  <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<display-name>Spring MVC Application</display-name>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
}


我认为spring安全文件的配置存在一些问题,但我不明白哪里出了问题。

我已经弄清楚了这里发生了什么,但我认为您最好只使用Java配置或XML配置,而不是在集成spring MVC和安全性方面混合和匹配它们

在XML配置中,springSecurityFilterChain由spring-security.XML中的http命名空间创建。参考因为您已经切换到java配置,所以没有创建springSecurityFilterChain,这正是应用程序所抱怨的

要在中创建springSecurityFilterChain,需要执行以下两个步骤

第一步

从web.xml文件中删除以下内容

 <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
AbstractSecurityWebApplicationInitializer说 当与AbstractSecurityWebApplicationInitializer一起使用时,该类通常与AbstractContextLoaderInitializer的子类一起使用

所以现在您必须自己创建AbstractContextLoaderInitializer。为此,我做了两个更改

步骤1:-从web.xml中删除以下内容

   <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

   <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
而ApplicationContextSpring将

正如我所说,您最好创建java或xml配置。

您正在创建一个FilterChainProxy bean,在xml配置中有一个空的筛选器列表,这个bean通过DelegatingFilterProxy在web.xml中使用。FilterChainProxygetFilters尝试在空列表上迭代,并自然失败,出现NullPointerException


问题的根源在于,您不能像这样混合使用Java配置和传统的XML配置。Java配置创建了一个单独的FilterChainProxy bean,该bean与通过XML配置的bean无关。

web.XML中的/*在正确之后?@melli-182是的,我认为这是正确的,但是做出该注释,它会导致过滤器映射和url模式标记永远不会关闭。@melli-182否,这不是注释,它看起来像是代码段中的注释,在.xml中,这不是注释的/*符号。您看过这个吗?如果您只使用xml或java配置,可能会更容易。我尝试了这样的解决方案,但再次出现此错误没有定义名为“springSecurityFilterChain”的bean完全改变了我上面的答案。请现在查看谢谢,我同意,我会尝试创建.xml配置。很抱歉,我再次尝试了您的第一个变体,仅将此springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain/*添加到web.xml,并且它正在工作,您可以将您的问题编辑为第一个变体,我将其标记为true,谢谢
 <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
public class SpringSecurityInitializer extends
        AbstractSecurityWebApplicationInitializer {
}
   <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

   <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
public class SpringAnnotationWebInitializer extends
        AbstractContextLoaderInitializer {

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
        applicationContext.register(ApplicationContextSpring.class);
        return applicationContext;
    }

}
@Configuration
@ImportResource("classpath:applicationContext.xml")
@Import(SecurityConfig.class)
public class ApplicationContextSpring {

}