210302:SpringBoot 中默認(rèn)可以使用多個(gè)@RequestBody的接收參數(shù)嗎?-java.lang.OutOfMemoryError: PermGen space有效解決方法

一. SpringBoot 中默認(rèn)可以使用多個(gè)@RequestBody的接收參數(shù)嗎?

報(bào)I/O error while reading input message錯(cuò)怎么辦?

最近的SpringBoot項(xiàng)目中post提交需要傳多個(gè)參數(shù),于是就憑直覺(jué)在方法里寫了兩個(gè)參數(shù)接收前端傳過(guò)來(lái)的JSON對(duì)象

(@RequestBody A a, @RequestBody B b),但是報(bào)錯(cuò)后才發(fā)現(xiàn)問(wèn)題所在。

報(bào)錯(cuò)內(nèi)容如下:

I/O error while reading input message; nested exception is java.io.IOException: Stream closed]

查了下資料后才知道:SpringMVC中@RequestBody是讀取的流的方式, 在取 body參數(shù)時(shí)第一個(gè)參數(shù)取到后把request.getInputStream()關(guān)閉,導(dǎo)致后面的@requestBody的對(duì)象拿取不到,就報(bào)錯(cuò)了。

又接著了解到,其實(shí)請(qǐng)求參數(shù)永遠(yuǎn)都是一個(gè),因?yàn)橐粋€(gè)request中只包含一個(gè)request body. 理解了這個(gè),就會(huì)明白Spring MVC不支持多個(gè)@RequestBody。

然后看到網(wǎng)上的解決方法大概有以下幾種:

  1. 繼承HandlerMethodArgumentResolver接口,重寫supportsParameter()、resolveArgument()等方法,實(shí)現(xiàn)多RequestBody的解析。
  2. 用Map<String, Object>接受request body,自己反序列化到各個(gè)entity中。
  3. 創(chuàng)建一個(gè)新的entity,將兩個(gè)entity都放進(jìn)去。這是最簡(jiǎn)單的,但是不夠“優(yōu)雅”。

第一種、第三種都感覺(jué)太麻煩了,我用了第二種:

最后還是建議使用第二種或者第三種,因?yàn)榍岸酥挥脗饕粋€(gè)參數(shù)。強(qiáng)行去擴(kuò)展原生的代碼結(jié)構(gòu),往往是我們的程序設(shè)計(jì)有問(wèn)題。

二. java.lang.OutOfMemoryError: PermGen space有效解決方法

PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域OutOfMemoryError: PermGen space從表面上看就是內(nèi)存益出,解決方法也一定是加大內(nèi)存。說(shuō)說(shuō)為什么會(huì)內(nèi)存益出:這一部分用于存放Class和Meta的信息,Class在被 Load的時(shí)候被放入PermGen space區(qū)域,它和和存放Instance的Heap區(qū)域不同,GC(Garbage Collection)不會(huì)在主程序運(yùn)行期對(duì)PermGen space進(jìn)行清理,所以如果你的APP會(huì)LOAD很多CLASS的話,就很可能出現(xiàn)PermGen space錯(cuò)誤。這種錯(cuò)誤常見(jiàn)在web服務(wù)器對(duì)JSP進(jìn)行pre compile的時(shí)候。

解決方法
一、手動(dòng)設(shè)置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.bat(windows系統(tǒng))或者catalina.sh(unix系統(tǒng))

  1. windows系統(tǒng) 在 TOMCAT_HOME/bin/catalina.bat 文件 echo Using CATALINA_BASE: "%CATALINA_BASE%"上面加入以下行:set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=256M -XX:MaxPermSize=512m
  2. unix系統(tǒng) 在 catalina.sh 文件echo "Using CATALINA_BASE: $CATALINA_BASE"上面或者第一行加入以下行:set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=256M -XX:MaxPermSize=512m
  3. 或者加入JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

二、如果啟動(dòng)Tomcat的時(shí)候是通過(guò)MyEclipse啟動(dòng)服務(wù)器的話,需要在MyEclipse里面同樣設(shè)置內(nèi)存大小

MyEclipse啟動(dòng) 參考文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容