Anda benar, parameter beranotasi @RequestBody diharapkan untuk menampung seluruh isi permintaan dan mengikat ke satu objek, jadi pada dasarnya Anda harus menggunakan opsi Anda.
Jika Anda benar-benar menginginkan pendekatan Anda, ada implementasi khusus yang dapat Anda lakukan:
Katakan ini json Anda:
{
"str1": "test one",
"str2": "two test"
}
dan Anda ingin mengikatnya ke dua parameter di sini:
@RequestMapping(value = "/Test", method = RequestMethod.POST)
public boolean getTest(String str1, String str2)
Pertama-tama tentukan anotasi khusus, misalnya @JsonArg
, dengan jalur JSON seperti jalur ke informasi yang Anda inginkan:
public boolean getTest(@JsonArg("/str1") String str1, @JsonArg("/str2") String str2)
Sekarang tulis Custom HandlerMethodArgumentResolver yang menggunakan JsonPath yang ditentukan di atas untuk menyelesaikan argumen sebenarnya:
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 "";
}
}
Sekarang daftarkan saja ini dengan Spring MVC. Sedikit terlibat, tetapi ini akan berfungsi dengan baik.
@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface JsonArg { String value() default ""; }
Meskipun benar bahwa
@RequestBody
harus memetakan ke satu objek, objek itu bisa menjadi aMap
, jadi ini memberi Anda cara yang baik untuk apa yang Anda coba capai (tidak perlu menulis satu objek pendukung):Anda juga dapat mengikat ObjectNode Jackson jika Anda menginginkan pohon JSON lengkap:
sumber
Map
objek tunggal untuk menyimpan sejumlah objek di dalamnya, tetapi objek tingkat atas harus tetap hanya satu, tidak boleh ada dua objek tingkat atas.Map<String, String>
: Perpustakaan dokumentasi API (kesombongan / springfox dll) mungkin tidak akan dapat mengurai skema permintaan / tanggapan Anda dari kode sumber Anda.Anda dapat mencampur argumen posting dengan menggunakan variabel body dan path untuk tipe data yang lebih sederhana:
sumber
Untuk melewatkan banyak objek, params, variabel, dan sebagainya. Anda dapat melakukannya secara dinamis menggunakan ObjectNode dari perpustakaan jackson sebagai parameter Anda. Anda bisa melakukannya seperti ini:
Saya berharap bantuan ini.
sumber
@RequestParam
adalah parameterHTTP GET
or yangPOST
dikirim oleh klien, pemetaan permintaan adalah segmen URL yang variabel:var1
&var2
adalah parameter permintaan.{params}
adalah pemetaan permintaan. Anda dapat menghubungi layanan Anda seperti:http:/host/form/user
atau dihttp:/host/form/firm
mana perusahaan & pengguna digunakan sebagaiPathvariable
.sumber
Solusi mudahnya adalah dengan membuat kelas muatan yang memiliki atribut str1 dan str2:
Dan setelah Anda bisa lewat
dan isi permintaan Anda adalah:
sumber
Alih-alih menggunakan json, Anda dapat melakukan hal yang sederhana.
Sekarang di pengontrol Anda perlu memetakan permintaan ajax seperti di bawah ini:
Semoga ini bisa membantu Anda.
sumber
Saya telah mengadaptasi solusi Biju:
Apa bedanya:
BR
sumber
parameter permintaan ada untuk GET dan POST, Untuk Dapatkan itu akan ditambahkan sebagai string kueri ke URL tetapi untuk POST itu ada dalam Badan Permintaan
sumber
Tidak yakin di mana Anda menambahkan json tetapi jika saya melakukannya seperti ini dengan sudut itu berfungsi tanpa requestBody: angluar:
Jawa:
sumber
Baik. Saya sarankan membuat Value Object (Vo) yang berisi bidang yang Anda butuhkan. Kode ini lebih sederhana, kami tidak mengubah fungsi Jackson dan bahkan lebih mudah untuk dipahami. Salam!
sumber
Anda dapat mencapai apa yang Anda inginkan dengan menggunakan
@RequestParam
. Untuk ini, Anda harus melakukan hal berikut:required
opsi ke false jika Anda ingin dapat mengirim nilai null.Saya tahu, ini sedikit hack tetapi berhasil! ;)
sumber
Anda juga bisa pengguna
@RequestBody Map<String, String> params
, lalu gunakanparams.get("key")
untuk mendapatkan nilai parametersumber
Anda juga dapat menggunakan Peta MultiValue untuk menampung requestBody. Berikut adalah contohnya.
tidak seperti anotasi @RequestBody saat menggunakan Peta untuk menampung isi permintaan, kita perlu memberi anotasi dengan @RequestParam
dan mengirim pengguna ke Json RequestBody
sumber