一. SpringBoot 中默認可以使用多個@RequestBody的接收參數(shù)嗎?
報I/O error while reading input message錯怎么辦?
最近的SpringBoot項目中post提交需要傳多個參數(shù),于是就憑直覺在方法里寫了兩個參數(shù)接收前端傳過來的JSON對象
(@RequestBody A a, @RequestBody B b),但是報錯后才發(fā)現(xiàn)問題所在。

報錯內(nèi)容如下:
I/O error while reading input message; nested exception is java.io.IOException: Stream closed]

查了下資料后才知道:SpringMVC中@RequestBody是讀取的流的方式, 在取 body參數(shù)時第一個參數(shù)取到后把request.getInputStream()關閉,導致后面的@requestBody的對象拿取不到,就報錯了。
又接著了解到,其實請求參數(shù)永遠都是一個,因為一個request中只包含一個request body. 理解了這個,就會明白Spring MVC不支持多個@RequestBody。
然后看到網(wǎng)上的解決方法大概有以下幾種:
- 繼承HandlerMethodArgumentResolver接口,重寫supportsParameter()、resolveArgument()等方法,實現(xiàn)多RequestBody的解析。
- 用Map<String, Object>接受request body,自己反序列化到各個entity中。
- 創(chuàng)建一個新的entity,將兩個entity都放進去。這是最簡單的,但是不夠“優(yōu)雅”。
第一種、第三種都感覺太麻煩了,我用了第二種:

最后還是建議使用第二種或者第三種,因為前端只用傳一個參數(shù)。強行去擴展原生的代碼結構,往往是我們的程序設計有問題。
二. java.lang.OutOfMemoryError: PermGen space有效解決方法
PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域OutOfMemoryError: PermGen space從表面上看就是內(nèi)存益出,解決方法也一定是加大內(nèi)存。說說為什么會內(nèi)存益出:這一部分用于存放Class和Meta的信息,Class在被 Load的時候被放入PermGen space區(qū)域,它和和存放Instance的Heap區(qū)域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS的話,就很可能出現(xiàn)PermGen space錯誤。這種錯誤常見在web服務器對JSP進行pre compile的時候。
解決方法
一、手動設置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 "
二、如果啟動Tomcat的時候是通過MyEclipse啟動服務器的話,需要在MyEclipse里面同樣設置內(nèi)存大小