Ich versuche, einige bestimmte Parameter von RequestMapping
Methoden zu lösen, um Werte aus dem Anfragetext zu extrahieren und validiert sie und injizieren sie in bestimmte annotierte Parameter.Wie kann ich im Frühling 'HandlerMethodArgumentResolver' den Anfragetext mehrmals lesen?
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 1, get corresponding input parameter from NativeWebRequest
// 2, validate
// 3, type convertion and assemble value to return
return null;
}
Das größte Problem ist, dass ich herausfinden, dass HttpServletRequest
(erhalten von NativeWebRequest
) Eingangsstrom nicht (einige Parameter in der Anfrage Körper) lesen kann mehr als einmal. Also, wie kann ich Inputstream
/Reader
oder die Anfrage Körper mehr als einmal abrufen?
Eine Lösung könnte sein, ein ThreadLocal zu verwenden, um Parameter innerhalb eines Filters aus einer Anfrage zu speichern und sie dann beliebig oft in Ihrem Code zu verwenden. –
@SandeepPoonia Dies kann helfen. Aber ein Problem ist, wenn ich den Körper in den Threadlocal (durch Aufruf von HttpServletRequest.getReader/getInputStream) speichern, wird dies nie wieder aufgerufen werden. Event in der Controller-Ebene kann ich nicht "@RequestBody String body" deklarieren (was eine Ausnahme durch Spring auslösen kann), weil Spring den Input-Stream nicht mehr lesen kann. – Kim