2017-06-16 137 views
3

目前,我AuditorAware实现使用Spring的SecurityContextHolder检索当前审计保存创建/修改用户名:如何在异步任务中利用spring-data-jpa审计(AuditorAware)?

@Service 
public class AuditorAwareImpl implements AuditorAware<UserDetails> { 

    private final UserDetailsService userDetailsService; 

    @Autowired 
    public AuditorAwareImpl(UserDetailsService userDetailsService){ 
     this.userDetailsService = userDetailsService; 
    } 

    @Override 
    public UserDetails getCurrentAuditor() { 
     Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
     return userDetailsService.loadUserByUsername(authentication.getName()); 
    } 
} 

这工作得很好大部分操作,除了由Spring批次的SimpleAsyncTaskExecutor执行异步任务。

的时候实体需要节省,因为SecurityContextHolder擦拭的请求已被处理后,和jobLauncher.run(...)回报asynchrnously,该AuditorAwareImpl.getCurrentAuditor()方法引发NullPointerException由于空getAuthentication()

java.lang.NullPointerException: null 
    at com.example.services.AuditorAwareImpl.getCurrentAuditor(AuditorAwareImpl.java:31) 
    at com.example.services.AuditorAwareImpl.getCurrentAuditor(AuditorAwareImpl.java:18) 

到目前为止我已将请求调用用户作为非标识参数包含在Job中,但不知道从哪里开始。

SecurityContextHolder不适合寻找调用“审核员”时,利用spring的内置审核的推荐方式是什么?

+0

我是这个问题的东西,任何解决方案呢? –

+0

我的意思是坚持,不是东西(错误) –

回答