我目前有一个使用Spring的RestController的restweb服务。我实现了一个HandlerInterceptorAdapter,我想在其中设置一些用户数据。
代码如下:
@Component
public class UserContextInterceptor extends HandlerInterceptorAdapter {
@Autowired
private UserContext userContext;
@Override
public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//set userContext here
userContext.setLoginId("loginId");
return true;
}
}
这是控制器:
@RestController
public class MyController {
@Autowired
private MyService myService;
@GetMapping
public Response processRequest(Request request) {
return myService.processRequest(request);
}
}
这是服务。这只是由控制器调用:
@Service
public class MyService {
@Autowired
private UserContext userContext;
public Response processRequest(Request request) {
//process request using userContext
if (userContext.getLoginId() == null)
throw new InvalidloginException("No login id!");
//do something else
return new Response();
}
}
UserContext只是一个包含用户特定字段的POJO。
在我的实现中,我认为UserContext不是线程安全的。每次请求到来时,UserContext对象都会被覆盖。
我想知道如何正确地自动连接/注释它,以便每次请求传入时都需要一个新的UserContext。而且UserContext将被正确地注入MyService。
这意味着MyService.processRequest中的所有调用都将始终向其注入不同的UserContext。
我想到的一个解决方案就是在MyService.processRequest()方法中传递UserContext对象。我只是想知道是否可以使用Spring的autowire或其他注释来解决这个问题。
谢谢!