


Anotasi tenang SpringMVC @RequestBody menukar kemahiran json dan object_javascript
Disebabkan Tahun Baharu Cina yang akan datang, pasukan projek tidak mempunyai banyak tugas, jadi saya mempunyai masa lapang untuk belajar panggilan tenang pada musim bunga. Saya mendapati bahawa musim bunga telah menjadi begitu hebat sehingga pengaturcara tidak perlu lagi mengambil berat tentang penukaran data dan permohonan dalam proses menulis antara muka, dan hanya perlu memberi tumpuan kepada perniagaan. Di bawah ini saya rumuskan langkah-langkah dan masalah yang dihadapi semasa proses penyelidikan.
Langkah:
1. git clone https://github.com/spring-guides/gs-rest-service.git Memuat turun kod sumber daripada laman web rasmi spring
2. Susun dengan maven (gradle juga boleh diterima)
3. Lari dan lawati http://localhost:8080/greeting
4. Hasil larian boleh menukar objek menjadi objek json dan mengembalikannya ke halaman
Pada masa ini, saya berfikir tentang cara menukar data yang diminta secara automatik kepada objek java Melalui google, saya mendapati bahawa spring sebenarnya telah menyediakan penukar HttpMessageConverter, dan MappingJackson2HttpMessageConverter (json ~kelas penukaran objek) dimuatkan secara lalai. . Hanya konfigurasikan @RequestBody Greeting gree untuk digunakan.
Kod lapisan pengawal adalah seperti berikut:
@RequestMapping(value = "/greeting", method = RequestMethod.POST,consumes = "application/json") public @ResponseBody Greeting greeting(@RequestBody Greeting gree) { System.out.println(gree.getContent()); return gree; }
Pada masa ini, saya membuat panggilan melalui pemalam Google (posmen), tetapi panggilan hidup atau mati tidak berjaya!
Menganalisis dan menyelesaikan masalah:
Pada masa ini saya merasakan punca masalah mungkin dalam aspek berikut:
1. Spring tidak memuatkan MappingJackson2HttpMessageConverter secara lalai (saya tidak tahu kaedah pemuatan khusus)
2. MappingJackson2HttpMessageConverter tidak boleh berfungsi selepas memuatkan (saya tidak tahu sebab mengapa ia tidak berfungsi)
Malah, sebab mengapa ia tidak berfungsi pada akhirnya adalah kerana saya terlalu percaya pada kod sumber spring (objek itu tidak menyediakan kaedah yang ditetapkan dengan dua soalan ini, pencari besar-besaran di Internet). tidak dapat mencari hasil yang sepadan. Tidak ada cara selain mencari punca masalah dan melihat kod sumber musim bunga.
Untuk soalan pertama:
Langkah 1: Tulis semula penukar jenis pemuatan secara manual
@Configuration @EnableWebMvc public class WebConfiguration extends WebMvcConfigurerAdapter { public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) { System.out.println("init convert is start !!!!!"); StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(); stringConverter.setWriteAcceptCharset(false); messageConverters.add(new MappingJackson2HttpMessageConverter()); System.out.println("init convert is stop !!!!!"); } }
Ujian mendapati ia masih tidak boleh digunakan, dan kini sebabnya semakin kurang jelas. Anda hanya boleh melihat cara spring memuatkan penukar jenis secara lalai. Ternyata dalam kaedah addDefaultHttpMessageConverters dalam WebMvcConfigurationSupport (kata kunci HttpMessageConverter dicerminkan dan dicari di mana ia digunakan, ia ditemui melalui pertimbangan dan penjejakan) seperti berikut:
@SuppressWarnings("deprecation") protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) { StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(); stringConverter.setWriteAcceptCharset(false); messageConverters.add(new ByteArrayHttpMessageConverter()); messageConverters.add(stringConverter); messageConverters.add(new ResourceHttpMessageConverter()); messageConverters.add(new SourceHttpMessageConverter<Source>()); messageConverters.add(new AllEncompassingFormHttpMessageConverter()); if (romePresent) { messageConverters.add(new AtomFeedHttpMessageConverter()); messageConverters.add(new RssChannelHttpMessageConverter()); } if (jaxb2Present) { messageConverters.add(new Jaxb2RootElementHttpMessageConverter()); } if (jackson2Present) { messageConverters.add(new MappingJackson2HttpMessageConverter()); } else if (jacksonPresent) { messageConverters.add(new org.springframework.http.converter.json.MappingJacksonHttpMessageConverter()); } }
Penukar lalai yang sepadan telah dimuatkan. Penyahpepijatan titik putus menunjukkan bahawa tiada masalah dengan konfigurasi lalai.
Ia hanya boleh dikatakan berpunca daripada masalah kedua, tetapi saya tidak tahu mengapa ia menyebabkan masalah ini (masalah data json, atau masalah lain, tanpa mengetahui masalah, saya hanya boleh melihat permintaan). minta dan lihat cara penukar berfungsi. Kerana saya tidak tahu banyak tentang musim bunga, saya tidak tahu prinsipnya. Dalam kes ini, penggunaan yang sepadan hanya boleh didapati berdasarkan kelas kunci (HttpMessageConverter). Gunakan pengalaman untuk menilai dan nyahpepijat. Didapati bahawa kaedah readWithMessageConverters dalam AbstractMessageConverterMethodArgumentResolver ialah kaedah pemprosesan untuk permintaan permintaan untuk melaksanakan penukaran jenis.
protected <T> Object readWithMessageConverters(HttpInputMessage inputMessage, MethodParameter methodParam, Type targetType) throws IOException, HttpMediaTypeNotSupportedException { MediaType contentType; try { contentType = inputMessage.getHeaders().getContentType(); } catch (InvalidMediaTypeException ex) { throw new HttpMediaTypeNotSupportedException(ex.getMessage()); } if (contentType == null) { contentType = MediaType.APPLICATION_OCTET_STREAM; } Class<?> contextClass = methodParam.getContainingClass(); Class<T> targetClass = (Class<T>) ResolvableType.forType(targetType, ResolvableType.forMethodParameter(methodParam)).resolve(); for (HttpMessageConverter<?> converter : this.messageConverters) { if (converter instanceof GenericHttpMessageConverter) { GenericHttpMessageConverter<?> genericConverter = (GenericHttpMessageConverter<?>) converter; if (genericConverter.canRead(targetType, contextClass, contentType)) { if (logger.isDebugEnabled()) { logger.debug("Reading [" + targetType + "] as \"" + contentType + "\" using [" + converter + "]"); } return genericConverter.read(targetType, contextClass, inputMessage); } } if (targetClass != null) { if (converter.canRead(targetClass, contentType)) { if (logger.isDebugEnabled()) { logger.debug("Reading [" + targetClass.getName() + "] as \"" + contentType + "\" using [" + converter + "]"); } return ((HttpMessageConverter<T>) converter).read(targetClass, inputMessage); } } } throw new HttpMediaTypeNotSupportedException(contentType, allSupportedMediaTypes); }
Pada masa ini, didapati bahawa penukar mesej jenis sepadan MappingJackson2HttpMessageConverter telah ditemui mengikut kaedah canRead HttpMessageConverter, dan penukaran telah bermula, tetapi pengecualian masa jalan telah dibuang. Kerana pengecualian bukan output pada konsol. Melalui penyahpepijatan titik putus, saya mendapati bahawa kaedah readJavaType MappingJackson2HttpMessageConverter melemparkan pengecualian masa jalan Melalui kod sumber, saya mendapati bahawa lapisan bawah dikendalikan oleh objectMapper Jackson adalah seperti berikut:
try { return this.objectMapper.readValue(inputMessage.getBody(), javaType); } catch (IOException ex) { throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex); }
Jika saya mengeluarkan kod secara berasingan dan menjalankannya dalam kaedah utama, tetapi ia masih tidak berfungsi, maka saya boleh mencari masalahnya. Sama ada jenis salah atau data input salah. Selepas pemeriksaan yang teliti, saya mendapati bahawa tidak ada masalah dengan data json, dan ia juga boleh ditukar menggunakan jsonobject. Pada masa ini, ia hanya boleh dinilai bahawa terdapat masalah dengan javaType yang masuk. Jika saya membukanya dan mendapati objek itu (Salam) tidak mempunyai kaedah yang ditetapkan, saya tertanya-tanya adakah kerana jakson tidak boleh berfungsi (prinsipnya tidak jelas). Jika ya, saya menyediakan kaedah yang ditetapkan untuk objek ini dan ia boleh dijalankan semula. Selepas berpusing-pusing dalam bulatan, saya akhirnya menyelesaikan masalah itu, tetapi melalui masalah ini, saya menjadi lebih sedar tentang mekanisme kerja spring's restful.

Memahami bagaimana enjin JavaScript berfungsi secara dalaman adalah penting kepada pemaju kerana ia membantu menulis kod yang lebih cekap dan memahami kesesakan prestasi dan strategi pengoptimuman. 1) aliran kerja enjin termasuk tiga peringkat: parsing, penyusun dan pelaksanaan; 2) Semasa proses pelaksanaan, enjin akan melakukan pengoptimuman dinamik, seperti cache dalam talian dan kelas tersembunyi; 3) Amalan terbaik termasuk mengelakkan pembolehubah global, mengoptimumkan gelung, menggunakan const dan membiarkan, dan mengelakkan penggunaan penutupan yang berlebihan.

Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.

Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing

Artikel ini menunjukkan integrasi frontend dengan backend yang dijamin oleh permit, membina aplikasi edtech SaaS yang berfungsi menggunakan Next.Js. Frontend mengambil kebenaran pengguna untuk mengawal penglihatan UI dan memastikan permintaan API mematuhi dasar peranan


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

VSCode Windows 64-bit Muat Turun
Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft