Spring Boot: доступ к данным Interceptor в RestController - PullRequest
0 голосов
/ 03 мая 2019

У меня есть простое приложение SpringBoot (2.1.4), которое использует Interceptor для проверки некоторых входящих запросов. Перехватчик, в частности, создает объект, к которому мне затем (после preHandle()) нужно будет обратиться в моем RestController.

Если быть более точным, это мой перехватчик:

public class MyInterceptor extends HandlerInterceptorAdapter {
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception {}

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}

    @Override
    public boolean preHandle(HttpServletRequest requestServlet, HttpServletResponse responseServlet, Object handler) throws Exception {

        X x = new X();
        x.computeCureForCancerAndStoreItInThisInstance();

        return true;
    }
}

И мне нужно получить доступ к x в моем контроллере:

@RestController
@RequestMapping("/")
public class MyController {
    @GetMapping("/")
    @ResponseBody
    public ResponseEntity getCureForCancer() {

        // access object x HERE!

        return new ResponseEntity<String>("ok", HttpStatus.OK);
    }
}

Теперь мой вопрос: как мне получить доступ к указанному экземпляру X в моем контроллере?

1 Ответ

1 голос
/ 03 мая 2019

Вы можете использовать ServletRequest#setAttribute в перехватчике:

public class MyInterceptor extends HandlerInterceptorAdapter {
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // create x
    request.setAttribute("com.acme.x", x);
    return true;
  }
}

И соответствующий @RequestAttribute в Controller:

public ResponseEntity myHandler(@RequestAttribute("com.acme.x") X x) 
...