Java 位于org.springframework.security.web.FilterChainProxy.getFilters的NullPointerException
我尝试使用spring安全性,并得到了这个错误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.
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 {
}