Nach meiner Erfahrung ist der beste Weg, ich habe ähnliche Sachen gemacht, durch HandlerMethodArgumentResolver
.
Stellen Sie sich vor, Sie haben einen benutzerdefinierten Typ, nennen wir ihn UserContext
, in dem Sie die Informationen speichern, die für die Anforderung benötigt werden. Und Sie haben eine UserContextService
haben wir eine Methode getUserContext(HttServletRequest)
, die verwendet wird, um den Kontext basierend auf der Anfrage abrufen, aus denen Sie Ihre Datenbank basierend auf was Anfrage Parameter/Header/Pfad-Variable, usw. aufrufen können. Sie können das verfeinern wie du es brauchst. Aber auf der Grundlage dieser einfachen Annahmen, können Sie einen Controller haben, der wie folgt aussieht:
@RequestMapping("/some/url")
public SomeResponse someMethod(UserContext userContext, ...) {
//do something here with UserContext
}
Die Art und Weise, dass der Frühling dieses Usercontext in Ihrem Controller injizieren würde HandlerMethodArgumentResolver
wie diese mit einem benutzerdefinierten sein:
@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
}
}
}
Das registrieren Sie, indem Sie die WebMvcConfigurer.addArgumentResolvers
Methode in Ihrer WebMvcConfigurer
Bean/Config-Klasse überschreiben.
Dieser Mechanismus ist die gleiche von @PathVariable
verwendet, @RequestParam
, etc ...
Dank - das ist genau das, was ich suchte, einfach und macht den Job :) – matthewrk