从Spring Boot 1.3.8升级到Spring Boot 1.4.4后,我在NullPointerException
中得到AbstractRememberMeServices
,因为记录器未成功实例化。
在this行投放NullPointerException
。
我写了一个自定义的RememberMeService
,它扩展了AbstractRememberMeServices
。此服务已注册为bean,如以下代码中所示:
@Bean
RememberMeServices rememberMeServices(UserDetailsService userDetailsService, UserRepository userRepository, RememberMeTokenRepository rememberMeTokenRepository, RandomService randomService) {
String key = env.getProperty("security.rememberme.key");
RememberMeService rememberMeService = new RememberMeService(key, userDetailsService, userRepository, rememberMeTokenRepository, randomService);
rememberMeService.setAlwaysRemember(true);
return rememberMeService;
}
此错误似乎与此SO question有关。另外JHipster有类似的issue。
有谁知道为什么记录器没有成功实例化?
答案 0 :(得分:1)
我知道这是一个老问题,但我刚刚在库的自定义RememberMeServices
impl中遇到了同样的问题。您可能会发现Spring启动日志中提到的问题的指示。例如:
2018-04-11 07:32:07.311 INFO 1 --- [ost-startStop-1] osafCglibAopProxy:最终方法[public final org.springframework.security.core.Authentication org.springframework.security.web。 authentication.rememberme.AbstractRememberMeServices.autoLogin(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)]无法通过CGLIB获取代理:对此方法的调用不会被路由到目标实例,并可能导致NPE未经初始化代理实例中的字段。
在这种情况下,子类必须具有一些需要CGLIB代理的功能,例如方法上的@Transactional
。如果不存在这样的特征,则CGLIB将不是必需的,并且子类将按预期运行。
答案 1 :(得分:0)
也出现了这个错误。当我调试时,我发现 AbstractRememberMeServices 的属性几乎都是null。然后我想,也许注入弹簧不起作用。所以我把我的代码更改为:
.rememberMe()
.rememberMeServices(new MyRememberMeServices(env, userDetailsService, userRepo, tokenRepo))
.and();
有效。但我不明白为什么......