Bạn nói đúng, tham số chú thích @RequestBody dự kiến sẽ giữ toàn bộ nội dung của yêu cầu và liên kết với một đối tượng, vì vậy về cơ bản bạn sẽ phải thực hiện với các tùy chọn của mình.
Nếu bạn thực sự muốn cách tiếp cận của mình, có một triển khai tùy chỉnh mà bạn có thể làm:
Nói đây là json của bạn:
{
"str1": "test one",
"str2": "two test"
}
và bạn muốn liên kết nó với hai tham số ở đây:
@RequestMapping(value = "/Test", method = RequestMethod.POST)
public boolean getTest(String str1, String str2)
Trước tiên, hãy xác định một chú thích tùy chỉnh, chẳng hạn @JsonArg
, với đường dẫn JSON giống như đường dẫn đến thông tin mà bạn muốn:
public boolean getTest(@JsonArg("/str1") String str1, @JsonArg("/str2") String str2)
Bây giờ hãy viết một Custom HandlerMethodArgumentResolver sử dụng JsonPath được định nghĩa ở trên để giải quyết đối số thực tế:
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 "";
}
}
Bây giờ chỉ cần đăng ký điều này với Spring MVC. Một chút liên quan, nhưng điều này sẽ hoạt động rõ ràng.