ใน SpringMVC คุณสามารถใช้สองคำอธิบายประกอบ @RequestBody และ @ResponseBody เพื่อทำการแปลงแพ็กเก็ตคำขอเป็นวัตถุและวัตถุเพื่อตอบสนองแพ็คเก็ตตามลำดับ ใช้กลไกการแปลงข้อความที่ยืดหยุ่นนี้ ใช้ HTTPMESSAGECONVERTER ที่กำหนดค่าโดยระบบเพื่อแยกวิเคราะห์จากนั้นเชื่อมโยงข้อมูลที่เกี่ยวข้องกับวัตถุที่จะส่งคืน
httpinputMessage
คลาสนี้เป็นนามธรรมของข้อความคำขอ HTTP ภายใน SpringMVC ในวิธีการอ่าน () ของ httpmessageConverter มีพารามิเตอร์อย่างเป็นทางการของ httpinputMessage ซึ่งเป็นนามธรรมภายในของตัวรับ "ข้อความร้องขอ" ที่เล่นโดยตัวแปลงข้อความของ SpringMVC ตัวแปลงข้อความดึงข้อความจาก "ข้อความร้องขอ" ตามกฎและแปลงเป็นวัตถุที่ประกาศในพารามิเตอร์วิธีการอย่างเป็นทางการ
แพ็คเกจ org.springframework.http; นำเข้า java.io.ioexception; นำเข้า java.io.inputstream; อินเตอร์เฟสสาธารณะ httpinputMessage ขยาย httpmessage {inputstream getbody () โยน ioexception;}}}httpoutputMessage
ในวิธีการเขียน () ของ httpmessageConverter มีพารามิเตอร์อย่างเป็นทางการของ httpoutputMessage ซึ่งเป็นนามธรรมภายในของตัวรับ "ข้อความตอบกลับ" ที่ใช้โดยตัวแปลงข้อความของ SpringMVC ตัวแปลงข้อความเขียน "ข้อความตอบกลับ" ลงในข้อความตอบกลับตามกฎบางอย่าง
แพ็คเกจ org.springframework.http; นำเข้า java.io.ioException; นำเข้า java.io.outputStream; อินเตอร์เฟสสาธารณะ httpoutputMessage ขยาย httpmessage {outputstream getbody () โยน ioexception;}}}httpmessageconverter
/ * * ลิขสิทธิ์ 2002-2010 ผู้แต่งหรือผู้แต่งดั้งเดิม * * ได้รับอนุญาตภายใต้ใบอนุญาต Apache เวอร์ชัน 2.0 ("ใบอนุญาต"); * คุณไม่สามารถใช้ไฟล์นี้ยกเว้นตามใบอนุญาต * คุณอาจได้รับสำเนาใบอนุญาตที่ * * http://www.apache.org/licenses/license-2.0 * * เว้นแต่ว่ากฎหมายที่บังคับใช้หรือตกลงที่จะเป็นลายลักษณ์อักษรซอฟต์แวร์ * แจกจ่ายภายใต้ใบอนุญาตจะถูกแจกจ่ายใน "ตาม" โดยไม่มีการรับประกันหรือเงื่อนไขใด ๆ * ดูใบอนุญาตสำหรับภาษาเฉพาะที่ควบคุมการอนุญาตและ * ข้อ จำกัด ภายใต้ใบอนุญาต */แพ็คเกจ org.springframework.http.converter; นำเข้า java.io.ioexception; นำเข้า java.util.list; นำเข้า org.springframework.http.httpinputMessage; org.springframework.http.mediatype; อินเตอร์เฟสสาธารณะ 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;}อินเทอร์เฟซ HTTPMESSAGECONVERTER ให้ 5 วิธี:
พารามิเตอร์ของวิธีการอ่านและการเขียนรวมถึงวัตถุ HttpinputMessage และ HttpOutputMessage ตามลำดับ วัตถุทั้งสองนี้เป็นตัวแทนของคำขอและการตอบสนองในการสื่อสาร HTTP ตามลำดับ สตรีมอินพุตและสตรีมเอาต์พุตที่สอดคล้องกันสามารถรับได้ผ่านวิธี getBody
ปัจจุบันมีตัวแปลงจำนวนมากที่ได้รับจากค่าเริ่มต้นในฤดูใบไม้ผลิรวมถึง:
| ชื่อ | ผล | การอ่าน MediaType สนับสนุน | เขียน MediaType สนับสนุน |
|---|---|---|---|
| ByteArrayhttpmessageconverter | การแปลงข้อมูลและอาร์เรย์ไบต์ | - | แอปพลิเคชัน/ออคเตตสตรีม |
| stringhttpmessageconverter | การแปลงข้อมูลและประเภทสตริง | ข้อความ/* | ข้อความ/ธรรมดา |
| formhttpmessageconverter | การแปลงรูปแบบและ multivaluemap <string, string = ""> | แอปพลิเคชัน/x-www-form-urlencoded | แอปพลิเคชัน/x-www-form-urlencoded |
| sourcehttpmessageconverter | transform.source การแปลงข้อมูลและ javax.xml.transform.source | ข้อความ/xml และแอปพลิเคชัน/xml | ข้อความ/xml และแอปพลิเคชัน/xml |
| Marshallinghttpmessageconverter | แปลงข้อมูล XML โดยใช้ SpringMarshaller/Unmarshaller | ข้อความ/xml และแอปพลิเคชัน/xml | ข้อความ/xml และแอปพลิเคชัน/xml |
| MappingJackson2httpmessageConverter | แปลงข้อมูล JSON โดยใช้ ObjectMapper ของ Jackson | แอปพลิเคชัน/JSON | แอปพลิเคชัน/JSON |
| Mappingjackson2xmlhttpmessageConverter | แปลงข้อมูล XML โดยใช้ xmlmapper ของ Jackson | แอปพลิเคชัน/XML | แอปพลิเคชัน/XML |
| bufferedimagehttpmessageconverter | การแปลงข้อมูลและ java.awt.image.bufferedimage | ทุกประเภทสนับสนุนโดย Java I/O API | ทุกประเภทสนับสนุนโดย Java I/O API |
กระบวนการจับคู่ httpmessageconverter:
@requestbody คำอธิบายประกอบ: ตามประเภทประเภทเนื้อหาของส่วนหัวของวัตถุคำขอจับคู่ httpmessageConverter ที่เหมาะสมทีละคนเพื่ออ่านข้อมูล
วัตถุส่วนตัว ReadWithMessageConverters (MethodParameter MethodParam, HttpinputMessage InputMessage, paramtype คลาส) โยนข้อยกเว้น {mediaType contentType = inputMessage.getheaders (). getContentType (); if (contentType == null) {stringBuilder builder = new StringBuilder (classutils.getShortName (MethodParam.getParameterType ())); String paramname = methodParam.getParameterName (); if (paramname! = null) {builder.append (''); builder.append (paramname); } โยน httpmediatypenotsupportedexception ใหม่ ("ไม่สามารถแยกพารามิเตอร์ (" + builder.toString () + "): ไม่พบประเภทเนื้อหา"); } list <s MediaType> allsupportedmediatypes = new ArrayList <MediyType> (); if (this.messageConverters! = null) {สำหรับ (httpmessageConverter <?> messageConverter: this.messageconverters) {allsupportedmediatypes.addall if (messageConverter.canread (paramtype, contentType)) {ถ้า (logger.isdebugenabled ()) {logger.debug ("อ่าน [" + paramtype.getName () + "] เป็น /" " } return messageConverter.read (paramtype, inputMessage); }}} โยน httpmediatypenotsupportedexception ใหม่ (ContentType, Allsupportedmediatypes); - @ResponseBody Annotation: ตามแอตทริบิวต์ ACCEPTION (คั่นด้วยเครื่องหมายจุลภาค) ของส่วนส่วนหัวของวัตถุคำขอทีละคนและข้ามเพื่อค้นหา httpmessageConverter ที่สามารถประมวลผลได้
โมฆะส่วนตัว writeWithMessageConverters (Object returnValue, httpinputMessage inputMessage, httpOutputMessage outputMessage) พ่น IOException, httpmediatypenotacceptable exception if (acceptedediatypes.isempty ()) {Acceptedediatypes = collections.singletonList (mediaType.all); } MediaType.sortbyqualityValue (Aceptededediatypes); คลาส <?> returnValUetype = returnValue.getClass (); รายการ <MedyType> allsupportedmediatypes = arrayList ใหม่ <MediyTepe> (); if (getMessageConverters ()! = null) {สำหรับ (MediaType Acceptedediatype: Acceptedediatypes) {สำหรับ (httpmessageconverter MessageConverter: getMessageConverters ()) MessageConverter.write (returnValue, AcceptedDiatiatype, outputMessage); if (logger.isdebugenabled ()) {mediaType contentType = outputMessage.getheaders (). getContentType (); if (contentType == null) {contentType = Acceptedediatype; } logger.debug ("เขียน [" + returnValue + "] เป็น /" " + contentType +" /"ใช้ [" + messageConverter + "]"); } this.ResponseArgumentUsed = true; กลับ; }}} สำหรับ (httpmessageConverter messageConverter: messageConverters) {allsupportedmediatypes.addall (MessageConverter.getSupportedmediatypes ()); }} โยน httpmediatypenotacceptableexception ใหม่ (allsupportedmediatypes); -ปรับแต่งตัวแปลง JSON
คลาส CustomJSONHTTPMESSAGECONVERTER ใช้ HTTPMESSAGECONVERTER {// การแมป JSON ของ Jackson Mapper ObjectMapper Private ObjectMapper = New ObjectMapper (); // ประเภทการสนับสนุนของตัวแปลงนี้: แอปพลิเคชัน/รายการส่วนตัว JSON รองรับ medmediatypes = array.aslist (mediaType.Application_JSON); / *** พิจารณาว่าตัวแปลงสามารถแปลงเนื้อหาอินพุตเป็นประเภท java* @param clazz java ประเภทที่ต้องแปลง* @param mediaType mediaType สำหรับคำขอนี้* @return*/ @Override บูลีนสามารถอ่านได้ } สำหรับ (MediaType Supportedediatype: GetSupportedmediatypes ()) {ถ้า (supportededmediatype.includes (mediaType)) {return true; }} return false; } / *** พิจารณาว่าตัวแปลงสามารถแปลงประเภท Java เป็นเนื้อหาเอาท์พุทที่ระบุ* @param clazz ประเภท java ที่ต้องแปลง* @param mediatype mediaType สำหรับคำขอนี้* @return* / @Override Boolean CanWrite mediaType.all.equals (mediaType)) {return true; } สำหรับ (MediaType Supportedediatype: GetSupportedmediatypes ()) {ถ้า (supportededmediatype.includes (mediaType)) {return true; }} return false; } / ** * รับ MediaType ที่ได้รับการสนับสนุนโดยตัวแปลงนี้ * @return * / @Override Public List GetSupportedmediatypes () {return supportedediatypes; } / *** อ่านเนื้อหาคำขอและแปลง JSON เป็นวัตถุ Java* @param clazz ประเภท java ที่ต้องแปลง* @param inputMessage วัตถุคำขอวัตถุ* @return* @throws ioexception* @throws httpmessagenotreadableException* / @ httpmessagenotreadableException {return mapper.readValue (inputMessage.getBody (), clazz); } / *** แปลงวัตถุ Java เป็น JSON เพื่อส่งคืนเนื้อหา* @param o วัตถุที่ต้องแปลง* @param contentType type return ประเภท* @param outputMessage object* @throws ioexception* @throws httpmessagenotwable iOexception, httpmessagenotwritableException {mapper.writevalue (outputMessage.getBody (), o); -ปรับแต่ง MappingJackson2httpmessage
จะเห็นได้จากวิธีการเขียนในคลาสหลัก abstracthttpmessageConverter ของ mappingjackson2httpmessageconverter ว่าวิธีการเขียนข้อมูลไปยังสตรีมเอาต์พุตที่ส่งคืนผลลัพธ์ผ่านวิธีการเขียน
@BeanPublic MappingJackson2httpmessageConverter Mappingjackson2httpmessageConverter () {ส่งคืน mappingjackson2httpmessageconverter () {// rewrite วิธีการเขียนบทเขียน outputMessage) พ่น IOException, httpmessagenotwritableException {// ใช้ ObjectMapper ของ Jackson เพื่อแปลงวัตถุ Java เป็น JSON String ObjectMapper Mapper = New ObjectMapper (); สตริง json = mapper.writevalueasstring (วัตถุ); logger.error (JSON); // เข้ารหัสสตริงผลลัพธ์ = JSON + "เข้ารหัส!"; logger.error (ผลลัพธ์); // เอาท์พุท OutputMessage.getBody (). เขียน (result.getBytes ()); - หลังจากนั้นคุณต้องกำหนดค่าตัวแปลงที่กำหนดเองนี้เป็นฤดูใบไม้ผลิ ที่นี่คุณเพิ่มตัวแปลงที่กำหนดเองโดยการเขียนเมธอด configureMessageConverters ใหม่ใน WebMVCCONFigurer:
// เพิ่มตัวแปลงที่กำหนดเอง @OverridePublic เป็นโมฆะ configureMessageConverters (รายการ <httpmessageConverter <? >> ตัวแปลง) {converters.add (mapingjackson2httpmessageConverter ()); Super.ConfigureMessageConverters (ตัวแปลง);}ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น