使用HandlerInterceptorAdapter在Spring RestController中按请求注入对象

时间:2018-10-11 06:13:39

标签: java spring spring-boot autowired spring-restcontroller

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

有什么想法吗?

谢谢!

0 个答案:

没有答案