Di SpringMVC, Anda dapat menggunakan dua anotasi @RequestBody dan @ResponseBody untuk menyelesaikan konversi paket permintaan ke objek dan objek ke paket respons, masing -masing. Mekanisme konversi pesan yang fleksibel ini digunakan. Gunakan httpmessageConverter yang dikonfigurasi oleh sistem untuk menguraikan, dan kemudian mengikat data yang sesuai ke objek yang akan dikembalikan.
HttpinputMessage
Kelas ini adalah abstraksi dari pesan permintaan HTTP dalam SpringMVC. Dalam metode read () dari httpmessageConverter, ada parameter formal httpinputMessage, yang merupakan abstraksi internal dari reseptor "permintaan permintaan" yang dimainkan oleh konverter pesan SpringMVC. Konverter pesan mengekstraksi pesan dari "pesan permintaan" sesuai dengan aturan dan mengubahnya menjadi objek yang dinyatakan dalam parameter formal metode.
Paket org.springframework.http; import java.io.ioException; import java.io.inputStream; antarmuka publik httpinputMessage memperluas httpmessage {inputStream getBody () melempar ioException;}HttpoutputMessage
Dalam metode write () dari httpmessageConverter, ada parameter formal httpoutputMessage, yang merupakan abstraksi internal dari reseptor "pesan respons" yang digunakan oleh konverter pesan SpringMVC. Konverter pesan menulis "pesan respons" ke dalam pesan respons sesuai dengan aturan tertentu.
Paket org.springframework.http; import java.io.ioException; import java.io.outputStream; antarmuka publik httpoutputMessage memperluas httpmessage {outputStream getBody () melempar ioException;}HttpmessageConverter
/ * * Hak Cipta 2002-2010 Penulis atau penulis asli. * * Dilisensikan di bawah lisensi Apache, versi 2.0 ("lisensi"); * Anda tidak boleh menggunakan file ini kecuali sesuai dengan lisensi. * Anda dapat memperoleh salinan lisensi di * * http://www.apache.org/licenses/license-2.0 * * kecuali diharuskan oleh hukum yang berlaku atau disepakati secara tertulis, perangkat lunak * yang didistribusikan di bawah lisensi didistribusikan atas dasar "sebagaimana adanya", * tanpa jaminan atau ketentuan apa pun, baik yang diungkapkan atau disiratkan. * Lihat lisensi untuk izin yang mengatur bahasa tertentu dan * batasan di bawah lisensi. */paket org.springframework.http.converter; import java.io.ioexception; import java.util.list; org.springframework.http.mediatype; antarmuka publik httpmessageConverter <T> {boolean canRead (kelas <?> clazz, mediatype mediatype); Boolean CanWrite (Class <?> Clazz, Mediatype Mediatype); Daftar <mediatype> getsupportedMediatypes (); T baca (class <? Extends t> clazz, httpinputMessage inputMessage) melempar ioException, httpmessagenotreadable exception; void write (tt, mediatype contentType, httpoutputMessage outputMessage) melempar ioException, httpmessagenotwritable exception;}Antarmuka httpmessageConverter menyediakan 5 metode:
Parameter metode baca dan tulis termasuk objek httpinputMessage dan httpoutputMessage, masing -masing. Kedua objek ini masing -masing mewakili bagian permintaan dan respons dalam komunikasi HTTP. Aliran input dan aliran output yang sesuai dapat diperoleh melalui metode getbody.
Saat ini, ada cukup banyak konverter yang disediakan secara default di musim semi, termasuk:
| nama | memengaruhi | Membaca Mediatype Dukungan | Tulis Mediatype Dukungan |
|---|---|---|---|
| BYTEARRAYHTTPMESSAGECONVERTER | Konversi Data dan Array Byte | / | Aplikasi/Octet-Stream |
| StringHttpMessageConverter | Konversi data dan jenis string | teks/* | teks/polos |
| FormhttpMessageConverter | Konversi bentuk dan multivaluemap <string, string = ""> | Aplikasi/X-WWW-Form-Urlencoded | Aplikasi/X-WWW-Form-Urlencoded |
| SourceHTTPMessageConverter | Transform.source konversi data dan javax.xml.transform.source | Teks/XML dan Aplikasi/XML | Teks/XML dan Aplikasi/XML |
| MarshallingHttpMessageConverter | Konversi data XML menggunakan springmarshaller/unmarshaller | Teks/XML dan Aplikasi/XML | Teks/XML dan Aplikasi/XML |
| Mappingjackson2httpmessageConverter | Konversi data JSON menggunakan ObjectMapper Jackson | Aplikasi/JSON | Aplikasi/JSON |
| MappingJackson2xmlhttpMessageConverter | Konversi data XML menggunakan XMLMapper Jackson | Aplikasi/XML | Aplikasi/XML |
| BufferedImageHTTPMessageConverter | Konversi data dan java.awt.image.bufferedImage | Semua jenis yang didukung oleh Java I/O API | Semua jenis yang didukung oleh Java I/O API |
Proses pencocokan httpmessageConverter:
@RequestBody Anotasi: Menurut tipe konten dari bagian header dari objek permintaan, cocokkan httpmessageConverter yang sesuai satu per satu untuk membaca data.
Private Object ReadWithMessageConVerters (MethodParameter MethodParam, HTTPInputMessage InputMessage, kelas paramType) melempar Exception {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); } lempar httpmediatypeNotsupportedException baru ("tidak dapat mengekstrak parameter (" + builder.tostring () + "): tidak ada tipe konten yang ditemukan"); } Daftar <Mediatype> AllSupportedMediatypes = new ArrayList <Mediatype> (); if (this.messageConVerters! = null) {for (httpmessageConverter <?> MessageConverter: this.messageConVerters) {allsupportedMediatypes.addall (messageConverter.getSupportedMediatypes (); if (messageConverter.canRead (paramType, contentType)) {if (logger.isdebugeNabled ()) {logger.debug ("membaca [" + paramtype.getName () + "] as /" " + contentType +" /"menggunakan [" + MessageConverter + "]"); } return messageConverter.read (paramType, inputMessage); }}} lempar httpmediatypeNotsupportedException baru (contentType, allsupportedMediatypes); } @ResponseBody Annotation: Menurut atribut penerimaan (dipisahkan koma) bagian header dari objek permintaan, satu per satu, dan melintasi untuk menemukan httpmessageConverter yang dapat diproses.
Private void writeWithMessageConverters (objek returnValue, httpinputMessage inputMessage, httpoutputMessage outputMessage) melempar ioException, httpmediatypeNotaccepteException {list <mediatype> AcceptedMediatypes = inputeSceptable. if (acceptedMediatypes.isempty ()) {acceptedMediatypes = collections.singletonlist (mediatype.all); } Mediatype.sortbyqualityValue (AcceptedMediatypes); Kelas <?> returnValueType = returnValue.getClass (); Daftar <Mediatype> allsupportedMediatypes = new ArrayList <mediatype> (); if (getMessageConverters() != null) { for (MediaType acceptedMediaType : acceptedMediaTypes) { for (HttpMessageConverter messageConverter: getMessageConverters()) { if (messageConverter.canWrite(returnValueType, acceptedMediaType)) { MessageConverter.write (returnValue, AcceptedMediatype, outputMessage); if (logger.isdebugeNabled ()) {mediatype contentType = outputMessage.getHeaders (). getContentType (); if (contentType == null) {contentType = acceptedMediatype; } logger.debug ("tertulis [" + returnValue + "] sebagai /" " + contentType +" /"menggunakan [" + MessageConverter + "]"); } this.ResponseARGumentSused = true; kembali; }}} untuk (httpmessageConverter MessageConverter: MessageConVertters) {AllSupportedMediatypes.addall (MessageConverter.GetSupportedMediatypes ()); }} lempar httpmediatypeNotacceptableException baru (AllSupportedMediatypes); }Kustomisasi konverter JSON
kelas customjsonhttpMessageConverter mengimplementasikan httpmessageConverter {// Jackson's JSON Mapping kelas Private ObjectMapper mapper = new ObjectMapper (); // Jenis dukungan dari konverter ini: Aplikasi/JSON Daftar Privat DidukungMediatypes = arrays.aslist (mediatype.application_json); /** * Determine whether the converter can convert the input content into Java type* @param clazz Java type that needs to be converted* @param mediaType MediaType for this request * @return */ @Override public boolean canRead(Class clazz, MediaType mediaType) { if (mediaType == null) { return true; } untuk (Mediatype SupportedMediatype: GetSupportedMediatypes ()) {if (supportedmediatype.includes (mediatype)) {return true; }} return false; } / *** Tentukan apakah konverter dapat mengonversi tipe Java ke konten output yang ditentukan* @param clazz jenis java yang perlu dikonversi* @param mediatype mediatype untuk permintaan ini* @return* / @override public canwrite (class clazz, mediatype mediatype) {if (if (if.= nulliatype mediatype mediatype mediatype) {IF (IF (IF (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF.= (IF. } untuk (Mediatype SupportedMediatype: GetSupportedMediatypes ()) {if (supportedmediatype.includes (mediatype)) {return true; }} return false; } / ** * Dapatkan mediatype yang didukung oleh konverter ini * @return * / @Override Daftar publik GetSupportedMediatypes () {return SupportedMediatypes; } /** * Read the request content and convert the Json into a Java object* @param clazz The Java type that needs to be converted* @param inputMessage Request object* @return * @throws IOException * @throws HttpMessageNotReadableException */ @Override public Object read(Class clazz, HttpInputMessage inputMessage) throws IOException, httpMessagenotreadableException {return mapper.readValue (inputMessage.getBody (), clazz); } / *** Konversi objek java ke json untuk mengembalikan konten* @param o objek yang perlu dikonversi* @param contentType tipe pengembalian* @param outputMessage objek kwitansi* @throws ioException* @throws httpmessagenwitedException* / @ @override void publik void Objek o, medtpmessagenwitable IOException, httpmessagenotwritable exception {mapper.writevalue (outputMessage.getBody (), o); }}Kustomisasi Mappingjackson2httpMessage
Dapat dilihat dari metode tulis di kelas induk abstracthttpmessageConverter dari MappingJackson2httpMessageConverter bahwa metode tersebut menulis data ke aliran output yang mengembalikan hasilnya melalui metode Writeintternal, jadi Anda hanya perlu mengesampingkan metode tersebut:
@BeanPublic Mappingjackson2httpMessageConverter MappingJackson2httpMessageConverter () {return metchjackson2httpmessageConverter (// outpputpputter (outsputpputpputpputter (Outsputppute (Outsage Obsrote (Outsputpute (Outsage Obsrote, Melempar IoException, httpmessagenotwritablexception {// Gunakan ObjectMapper Jackson untuk mengonversi objek Java menjadi JSON String ObjectMapper mapper = new ObjectMapper (); String json = mapper.writevalueAsstring (objek); Logger.Error (JSON); // Enkripsi Hasil String = JSON + "Dienkripsi!"; Logger.Error (hasil); // output outputMessage.getBody (). Write (result.getbytes ()); }};} Setelah itu, Anda perlu mengkonfigurasi konverter kustom ini ke Spring. Di sini Anda menambahkan konverter kustom dengan menulis ulang metode ConfigureMessageConverters di WebMvCconfigurer:
// Tambahkan konverter khusus @OverridEpublic void configureMessageConVertters (daftar <httpmessageConverter <? >> Converters) {converters.add (MappingJackson2httpMessageConverter ()); super.configuremessageConverters (konverter);}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.