升级到Spring Boot 1.4后,在AbstractRememberMeService中出现NullPointerException

时间:2017-02-20 22:14:09

标签: spring spring-boot spring-security

从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

有谁知道为什么记录器没有成功实例化?

2 个答案:

答案 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();

有效。但我不明白为什么......