以我的經驗,我做過類似工作的最好方法是通過HandlerMethodArgumentResolver
。
基本上可以想象你有一個自定義類型,我們稱之爲UserContext
,其中存儲了請求所需的信息。假設你有一個UserContextService
,假設它有一個方法getUserContext(HttServletRequest)
,用於根據請求檢索上下文,從中可以根據任何請求參數/頭/路徑變量等來調用數據庫。您可以改進如你所需。但是,在此基礎上簡單的假設,你可以有一個控制器,它看起來像這樣:
@RequestMapping("/some/url")
public SomeResponse someMethod(UserContext userContext, ...) {
//do something here with UserContext
}
Spring框架將注入這個的UserContext到您的控制器將與自定義HandlerMethodArgumentResolver
這樣的方式:
@Component
public class UserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
UserContextService
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType().equals(UserContext.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest req = (HttpServletRequest)webRequest.getNativeRequest();
UserContext userContext = userContextService.getUserContext(req);
if (userContext != null) {
return userContext;
} else {
return WebArgumentResolver.UNRESOLVED;
//Or throw exception
}
}
}
您將通過覆蓋您的WebMvcConfigurer
bean/config-class中的WebMvcConfigurer.addArgumentResolvers
方法進行註冊。
這個機制是通過@PathVariable
,@RequestParam
等使用相同的...
謝謝 - 這正是我一直在尋找,簡單和沒有工作:) – matthewrk