我目前有一个使用Spring的RestController的REST Web服务。我实现了一个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:
@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或其他注释来解决这个问题。
有什么想法吗?
谢谢!