首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定DelegatingFilterProxy上NullPointerException的原因?

如何确定DelegatingFilterProxy上NullPointerException的原因?
EN

Stack Overflow用户
提问于 2014-02-21 03:36:46
回答 2查看 1.1K关注 0票数 0

按照spring.io上的一个指南(https://spring.io/guides/tutorials/web/6/),我正在将我的应用程序迁移到Spring4。在拥有了指南中所示的NullPointerException之后,我遇到了一个SecurityWebAppInitializer。以下是跟踪堆栈:

代码语言:javascript
复制
java.lang.NullPointerException
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)

完整的堆栈如下:

代码语言:javascript
复制
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与指南相同。

代码语言:javascript
复制
@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的一部分:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    ...
}

在删除SecurityWebAppInitializer或注释掉它的父类AbstractSecurityWebApplicationInitializer之后,不会发生异常。感谢您事先提供的信息。

EN

回答 2

Stack Overflow用户

发布于 2014-02-21 05:21:31

当你迁移到Spring4时,你是否从你的web.xml中删除了springSecurityFilterChain?您当前应用程序中的spring安全配置似乎正在干扰新的基于注释的配置。

也就是说,Spring security的delating filter代理被配置了一个空的targetBeanName,这会导致空指针异常。如果只有SecurityWebAppInitializer起作用,这是不可能的。

您还可以在DelegatingFilterProxy构造函数和targetBeanName的设置器中设置一些断点,以查看是谁将其设置为null。

票数 0
EN

Stack Overflow用户

发布于 2015-08-18 14:42:50

我得到了相同的异常,因为默认bean名称被设置为null,通过在DelegatingFilterProxy构造函数中显式地将bean名称设置为'springSecurityFilterChain‘解决了这个问题

代码语言:javascript
复制
@Override
protected Filter[] getServletFilters() {

    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
    characterEncodingFilter.setEncoding("UTF-8");

    return new Filter[] { characterEncodingFilter, new DelegatingFilterProxy("springSecurityFilterChain")};
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21917794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档