按照spring.io上的一个指南(https://spring.io/guides/tutorials/web/6/),我正在将我的应用程序迁移到Spring4。在拥有了指南中所示的NullPointerException之后,我遇到了一个SecurityWebAppInitializer。以下是跟踪堆栈:
java.lang.NullPointerException
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)完整的堆栈如下:
Servlet.service() for servlet [dispatcher] in context with path [] threw exception
java.lang.NullPointerException
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:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
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:744)错误堆栈不会显示太多信息。如何确定其原因并解决此错误?
我使用Java配置的方式与指南中所示的方式相同。WebAppInitializer和SecurityWebAppInitializer与指南相同。
@Order(2)
public class WebAppInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { WebSecurityConfig.class, JPAConfig.class, CoreConfig.class, FacebookConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
return new Filter[] { characterEncodingFilter};
}
}
@Order(1)
public class SecurityWebAppInitializer
extends AbstractSecurityWebApplicationInitializer { }和WebConfig.java的一部分:
@Configuration
@EnableWebMvc
@PropertySource({ "classpath:mail.properties",
"classpath:express.properties" })
@ComponentScan(basePackages = { "com.myapp.account.web" })
@Import({CoreConfig.class})
public class WebConfig extends WebMvcConfigurerAdapter {
....
}和WebSecurityConfig.java:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
...
}在删除SecurityWebAppInitializer或注释掉它的父类AbstractSecurityWebApplicationInitializer之后,不会发生异常。感谢您事先提供的信息。
发布于 2014-02-21 05:21:31
当你迁移到Spring4时,你是否从你的web.xml中删除了springSecurityFilterChain?您当前应用程序中的spring安全配置似乎正在干扰新的基于注释的配置。
也就是说,Spring security的delating filter代理被配置了一个空的targetBeanName,这会导致空指针异常。如果只有SecurityWebAppInitializer起作用,这是不可能的。
您还可以在DelegatingFilterProxy构造函数和targetBeanName的设置器中设置一些断点,以查看是谁将其设置为null。
发布于 2015-08-18 14:42:50
我得到了相同的异常,因为默认bean名称被设置为null,通过在DelegatingFilterProxy构造函数中显式地将bean名称设置为'springSecurityFilterChain‘解决了这个问题
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
return new Filter[] { characterEncodingFilter, new DelegatingFilterProxy("springSecurityFilterChain")};
}https://stackoverflow.com/questions/21917794
复制相似问题