【发布时间】:2019-07-09 13:21:20
【问题描述】:
我有一个使用 SimpleJobLauncher 的 Spring 批处理应用程序。在那,我们有 Rest 请求触发 excel 上的批处理作业,在写入器阶段保存实体时,不会通过收到的 HTTP 线程选择 AuditorAware 最新设置。
我尝试在 JobParameter 中设置用户名,然后在 writer 中获取相同的用户名以设置用户名线程局部变量,但也没有被选中。
一旦我们收到向auditoraware提供用户信息的请求,我就会使用Threadlocal来存储用户。
public static final InheritableThreadLocal<String> USERNAME = new InheritableThreadLocal<>();
@Bean
public AuditorAware<String> auditorProvider() {
if (USERNAME.get() != null) {
return () -> Optional.of(USERNAME.get());
}
return () -> Optional.of(WebConstant.DEFAULT_USER);
}
public class HeaderInterceptor implements HandlerInterceptor {
/**
* This implementation always returns {@code true}.
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String username = request.getHeader("username");
if(null == username) {
throw new UserNotProvidedException("USER_NOT_PROVIDED");
}
USERNAME.set(username);
return true;
}
}
【问题讨论】:
标签: java spring spring-data-jpa spring-batch