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

一. 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)上的解決方法大概有以下幾種:

  1. 繼承HandlerMethodArgumentResolver接口,重寫supportsParameter()、resolveArgument()等方法,實現(xiàn)多RequestBody的解析。
  2. 用Map<String, Object>接受request body,自己反序列化到各個entity中。
  3. 創(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))

  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 "

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

MyEclipse啟動 參考文章

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

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

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