代码之家  ›  专栏  ›  技术社区  ›  racumin

使用HandlerInterceptorAdapter在SpringRestController中为每个请求注入对象

  •  0
  • racumin  · 技术社区  · 6 年前

    我目前有一个使用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或其他注释来解决这个问题。

    谢谢!

    0 回复  |  直到 6 年前