一. 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)上的解決方法大概有以下幾種:
- 繼承HandlerMethodArgumentResolver接口,重寫supportsParameter()、resolveArgument()等方法,實(shí)現(xiàn)多RequestBody的解析。
- 用Map<String, Object>接受request body,自己反序列化到各個(gè)entity中。
- 創(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))
- 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 - unix系統(tǒng) 在 catalina.sh 文件
echo "Using CATALINA_BASE: $CATALINA_BASE"上面或者第一行加入以下行:setJAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=256M -XX:MaxPermSize=512m - 或者加入
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)存大小