আপনি সঠিক, @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)
এখন একটি কাস্টম হ্যান্ডলারমিথডআর্গমেন্ট রিসোলভার লিখুন যা আসল যুক্তি সমাধানের জন্য উপরে সংজ্ঞায়িত জসনপথ ব্যবহার করে :
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 "";
}
}
এখন এটি স্প্রিং এমভিসির সাথে নিবন্ধন করুন। কিছুটা জড়িত, তবে এটি পরিষ্কারভাবে কাজ করা উচিত।