आप सही हैं, @RequestBody एनोटेट पैरामीटर से अपेक्षा की जाती है कि वह अनुरोध के संपूर्ण निकाय को रखे और एक वस्तु से बंधे, इसलिए आपको अनिवार्य रूप से अपने विकल्पों के साथ जाना होगा।
यदि आप पूरी तरह से अपना दृष्टिकोण चाहते हैं, तो एक कस्टम कार्यान्वयन है जिसे आप हालांकि कर सकते हैं:
कहो यह आपका जसन है:
{
"str1": "test one",
"str2": "two test"
}
और आप इसे यहां दो पारमों से बांधना चाहते हैं:
@RequestMapping(value = "/Test", method = RequestMethod.POST)
public boolean getTest(String str1, String str2)
पहले एक कस्टम एनोटेशन को परिभाषित करें @JsonArg
, जो JSON पथ के साथ उस सूचना को पथ के रूप में बताए जो आप चाहते हैं:
public boolean getTest(@JsonArg("/str1") String str1, @JsonArg("/str2") String str2)
अब एक कस्टम हैंडलरमैथोडरगमेंटइंडोल्वर लिखें जो वास्तविक तर्क को हल करने के लिए ऊपर परिभाषित JsonPath का उपयोग करता है:
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 "";
}
}
अब बस इसे स्प्रिंग एमवीसी के साथ पंजीकृत करें। थोड़ा सा शामिल है, लेकिन यह सफाई से काम करना चाहिए।