ฉันเชื่อว่านักพัฒนาที่ใช้สปริงใช้ @requestbody และ @ResponseBody Annotations และสามารถแยกวิเคราะห์อินพุตลงใน JSON และเอาต์พุตลงใน JSON ได้โดยตรง อย่างไรก็ตามคำขอและการตอบกลับของ HTTP นั้นเป็นข้อความซึ่งหมายความว่าเบราว์เซอร์และเซิร์ฟเวอร์สื่อสารโดยการแลกเปลี่ยนข้อความต้นฉบับและนี่คือ HttpMessageConverter ที่มีบทบาท
httpmessageconverter
แพ็คเก็ตตอบสนองการร้องขอ HTTP เป็นสตริงจริง เมื่อข้อความคำขอถูกป้อนลงในโปรแกรม Java จะถูกห่อหุ้มลงในสตรีม ServletInputStream นักพัฒนาจะอ่านข้อความและแพ็คเก็ตตอบกลับจะส่งออกแพ็คเก็ตตอบกลับผ่านสตรีม servletoutputstream
เฉพาะแพ็คเก็ตสตริงดั้งเดิมเท่านั้นที่สามารถอ่านได้จากสตรีมและสิ่งเดียวกันนั้นเป็นจริงสำหรับสตรีมเอาต์พุต จากนั้นเมื่อข้อความมาถึง SpringMVC/Springboot และออกจาก SpringMVC/Springboot มีปัญหาในการแปลงสตริงเป็นวัตถุ Java กระบวนการนี้ใน SpringMVC/SpringBoot ได้รับการแก้ไขผ่าน HTTPMESSAGECONVERTER HTTPMESSAGECONVERTER COLORE SORTER
อินเทอร์เฟซสาธารณะ httpmessageConverter <t> {boolean canread (คลาส <?> clazz, mediaType mediaType); บูลีน canwrite (คลาส <?> clazz, mediaType mediaType); รายการ <MediaType> getSupportedmediatypes (); t อ่าน (คลาส <? ขยาย t> clazz, httpinputMessage inputMessage) พ่น IOException, httpmessagenotreadableException; โมฆะเขียน (T T, MediaType ContentType, HttpOutputMessage outputMessage) พ่น IOException, httpMessagenotwritable Exception;}นี่คือตัวอย่างที่จะแสดง
@requestmapping ("/test")@responsebodypublic test test (@requestbody string param) {return "param '" + param + "'";}ก่อนที่คำขอจะเข้าสู่วิธีการทดสอบคลาสการใช้งาน HTTPMESSAGECONVERTER ที่สอดคล้องกันจะถูกเลือกตามคำอธิบายประกอบ @RequestBody เพื่อแยกวิเคราะห์พารามิเตอร์คำขอลงในตัวแปรพารามิเตอร์ เนื่องจากพารามิเตอร์ที่นี่เป็นของสตริงคลาส StringhttpMessageConverter จึงใช้ที่นี่ เมธอด canread () จะส่งคืนจริงจากนั้นวิธีการอ่าน () จะอ่านพารามิเตอร์คำขอจากคำขอและผูกกับตัวแปรพารามิเตอร์ของวิธีการทดสอบ ()
ในทำนองเดียวกันเมื่อวิธีการทดสอบถูกดำเนินการเนื่องจากค่าส่งคืนจะระบุ @ResponseBody, SpringMVC/SpringBoot จะใช้วิธีการเขียน () ของ StringhttpMessageConverter และเขียนผลลัพธ์เป็นค่าสตริงไปยังข้อความตอบกลับ แน่นอนเมธอด canWrite () กลับมาเป็นจริงในเวลานี้
ยืมตัวเลขต่อไปนี้เพื่ออธิบายกระบวนการทั้งหมดสั้น ๆ :
ในระหว่างการประมวลผลฤดูใบไม้ผลิข้อความคำขอและข้อความตอบกลับจะถูกแยกออกเป็นข้อความคำขอ httpinputMessage และข้อความตอบกลับ httpoutputMessage ตามลำดับ
เมื่อประมวลผลคำขอตัวแปลงข้อความที่เหมาะสมจะเชื่อมโยงข้อความร้องขอเข้ากับวัตถุพารามิเตอร์อย่างเป็นทางการในวิธีการ ที่นี่อาจมีหลายรูปแบบข้อความที่แตกต่างกันในวัตถุเดียวกันเช่น JSON และ XML เช่นเดียวกับการตอบสนองต่อคำขอ
ในฤดูใบไม้ผลิสำหรับรูปแบบข้อความที่แตกต่างกันมีคลาสการใช้งาน HTTPMESSAGECONVERTER ที่แตกต่างกันเพื่อจัดการกับรูปแบบข้อความต่าง ๆ สำหรับการใช้งานที่แตกต่างกันของการแยกวิเคราะห์ข้อความต่าง ๆ พวกเขาอยู่ในคลาสการใช้งาน HTTPMESSAGECONVERTER ที่แตกต่างกัน
แทนที่ @responsebody ของ httpmessageConverter เริ่มต้น
นี่คือตัวอย่างของ Springboot ใน SpringMVC/Springboot คำอธิบายประกอบ @requestbody ใช้ Jackson เพื่อแยกวิเคราะห์ JSON โดยค่าเริ่มต้น ดูตัวอย่างต่อไปนี้:
@controller @requestmapping ("/user") คลาสสาธารณะ userController {@requestmapping ("/testt") @ResponseBody ผู้ใช้สาธารณะ testt () {ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ ("ชื่อ", 18); ผู้ใช้ส่งคืน; - ผู้ใช้ระดับสาธารณะ {ชื่อผู้ใช้สตริงส่วนตัว; อายุจำนวนเต็มส่วนตัว โทรศัพท์จำนวนเต็มส่วนตัว อีเมลสตริงส่วนตัว ผู้ใช้สาธารณะ (ชื่อผู้ใช้สตริงอายุจำนวนเต็ม) {super (); this.username = ชื่อผู้ใช้; this.age = อายุ; -การเข้าถึงเบราว์เซอร์ /ผู้ใช้ /testt ส่งคืนดังนี้:
นี่เป็นผลมาจากการใช้การแยกวิเคราะห์แจ็คสัน ตอนนี้เราจะเปลี่ยนเป็นวัตถุการแยกวิเคราะห์ FastJSON ที่นี่เราแทนที่ httpmessageConverter เริ่มต้นซึ่งหมายถึงการใช้ fastjsonhttpmessageConverter เพื่อจัดการการแปลงระหว่างวัตถุ Java และ httpinputMessage/httpOutputMessage
ขั้นแรกให้สร้างคลาสการกำหนดค่าใหม่เพื่อเพิ่มการกำหนดค่า fastjsonhttpmessageConverter Spring 4.x แนะนำให้ใช้วิธีการอธิบายประกอบการกำหนดค่า Java นั่นคือไม่มีไฟล์ XML และ Springboot นั้นยิ่งกว่านั้นอีก
นำเข้า com.alibaba.fastjson.serializer.serializerfeature; นำเข้า com.alibaba.fastjson.support.config.fastjsonconfig; นำเข้า com.alibaba.fastjson.support.spring.fastjsonhttpmessageConverter; org.springframework.boot.autoconfigure.web.httpmessageConverters; นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.configuration; java.nio.charset.charset; @configurationPublic คลาส httpmessageConverterconfig {// แนะนำ fastjson เพื่อแยกวิเคราะห์ JSON อย่าใช้แพ็คเกจ Jackson เริ่มต้น // แพ็คเกจ Fastjson จะต้องแนะนำใน pom.xml fastjsonhttpmessageConverters () {// 1 กำหนดวัตถุที่แปลงข้อความ fastjsonhttpmessageconverter fastconverter = ใหม่ fastjsonhttpmessageConverter (); // 2. เพิ่มข้อมูลการกำหนดค่า fastjson fastjsonconfig fastjsonconfig = ใหม่ fastjsonconfig (); serializerfeature [] serializerfeatures = ใหม่ serializerfeature [] {// ปุ่มเอาท์พุทเป็นคำพูดสองครั้ง // serializerfeature.quotefieldNames, // ไม่ว่าจะส่งออกฟิลด์เป็นค่าว่างถ้าเป็นค่าว่าง serializerfeature.writenullnumberaszero, // ถ้าฟิลด์รายการเป็นโมฆะเอาต์พุตคือ [], ไม่ใช่ null serializerfeature.writenulllistasempty, // ถ้าฟิลด์ประเภทตัวละครเป็นโมฆะ serializerfeature.writenullbooleanasfalse, // วันที่ตัวแปลง serializerfeature.writedateusedateFormat, // การอ้างอิงแบบวงกลม serializerfeature.disableCircularReferenceDectect,}; fastjsonconfig.setserializerfeatures (serializerfeatures); fastjsonconfig.setcharset (charset.forname ("UTF-8")); // 3. เพิ่มข้อมูลการกำหนดค่าใน Convert FastConverter.SetFastJsonConfig (fastjsonConfig); // 4. เพิ่มแปลงเป็นแปลง httpmessageConverter <?> converter = fastConverter; ส่งคืน httpmessageconverters ใหม่ (ตัวแปลง); -ที่นี่หากค่าของประเภทสตริงเป็นโมฆะมันจะกลับมา "" หากค่าของ null มันจะส่งคืน 0 รีสตาร์ทแอปพลิเคชันเข้าถึง /ผู้ใช้ /testt อินเตอร์เฟสอีกครั้งและส่งคืนดังนี้:
คุณจะเห็นว่า null ถูกแปลงเป็น "" หรือ 0 ในเวลานี้
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น