2

I currently have a REST Web service using Spring's RestController. I implemented a HandlerInterceptorAdapter where I want to set some user data.

Code is like this:

@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;
  }
}

Here is the RestController:

@RestController
public class MyController {

  @Autowired
  private MyService myService;

  @GetMapping
  public Response processRequest(Request request) {
    return myService.processRequest(request);
  }
}

Here is the Service. This is just called by the controller:

@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();
  }
}

The UserContext is just a POJO containing user-specific fields.

In my implementation, the UserContext I think is not thread safe. The UserContext object would be overridden everytime a request comes. I would like to know how to properly autowire/annotate it in such a way that I want a new UserContext everytime a request comes in. And that UserContext would be properly injected in MyService. This means that all calls in MyService.processRequest would always have a different UserContext injected to it.

One solution I was thinking of was just to pass the UserContext object in the MyService.processRequest() method. I was just wondering if this can be solved using Spring's autowire or other annotations.

Any ideas?

Thanks!

racumin
  • 392
  • 2
  • 3
  • 17
  • 1
    You may want to use request scoped bean instead of a singleton bean as described in https://www.baeldung.com/spring-bean-scopes – Kishore Kirdat Oct 11 '18 at 06:38
  • @KishoreKirdat You are right. Request scoped bean solve my problem. I used this https://stackoverflow.com/a/36318183/2682526 for the solution – racumin Oct 11 '18 at 09:20

0 Answers0