Sie haben Recht, es wird erwartet, dass der mit @RequestBody annotierte Parameter den gesamten Hauptteil der Anforderung enthält und an ein Objekt bindet, sodass Sie im Wesentlichen mit Ihren Optionen arbeiten müssen.
Wenn Sie Ihren Ansatz unbedingt wollen, gibt es eine benutzerdefinierte Implementierung, die Sie jedoch ausführen können:
Sagen Sie, das ist Ihr json:
{
"str1": "test one",
"str2": "two test"
}
und Sie möchten es hier an die beiden Parameter binden:
@RequestMapping(value = "/Test", method = RequestMethod.POST)
public boolean getTest(String str1, String str2)
Definieren Sie zunächst eine benutzerdefinierte Anmerkung, z. B. @JsonArg
mit dem JSON-Pfad wie dem Pfad zu den gewünschten Informationen:
public boolean getTest(@JsonArg("/str1") String str1, @JsonArg("/str2") String str2)
Schreiben Sie nun einen benutzerdefinierten HandlerMethodArgumentResolver, der den oben definierten JsonPath verwendet , um das eigentliche Argument aufzulösen:
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.IOUtils;
import org.springframework.core.MethodParameter;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import com.jayway.jsonpath.JsonPath;
public class JsonPathArgumentResolver implements HandlerMethodArgumentResolver{
private static final String JSONBODYATTRIBUTE = "JSON_REQUEST_BODY";
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(JsonArg.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
String body = getRequestBody(webRequest);
String val = JsonPath.read(body, parameter.getMethodAnnotation(JsonArg.class).value());
return val;
}
private String getRequestBody(NativeWebRequest webRequest){
HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
String jsonBody = (String) servletRequest.getAttribute(JSONBODYATTRIBUTE);
if (jsonBody==null){
try {
String body = IOUtils.toString(servletRequest.getInputStream());
servletRequest.setAttribute(JSONBODYATTRIBUTE, body);
return body;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return "";
}
}
Registrieren Sie dies jetzt einfach bei Spring MVC. Ein bisschen kompliziert, aber das sollte sauber funktionieren.