0
点赞
收藏
分享

微信扫一扫

210302:SpringBoot 中默认可以使用多个@RequestBody的接收参数吗?-java.lang.OutOfMemoryError: PermGen space有效解决方法

Java旺 2021-09-28 阅读 115
每日复盘

一. SpringBoot 中默认可以使用多个@RequestBody的接收参数吗?

报I/O error while reading input message错怎么办?

最近的SpringBoot项目中post提交需要传多个参数,于是就凭直觉在方法里写了两个参数接收前端传过来的JSON对象

(@RequestBody A a, @RequestBody B b),但是报错后才发现问题所在。

报错内容如下:

查了下资料后才知道:SpringMVC中@RequestBody是读取的流的方式, 在取 body参数时第一个参数取到后把request.getInputStream()关闭,导致后面的@requestBody的对象拿取不到,就报错了。

又接着了解到,其实请求参数永远都是一个,因为一个request中只包含一个request body. 理解了这个,就会明白Spring MVC不支持多个@RequestBody。

  1. 继承HandlerMethodArgumentResolver接口,重写supportsParameter()、resolveArgument()等方法,实现多RequestBody的解析。
  2. 用Map<String, Object>接受request body,自己反序列化到各个entity中。
  3. 创建一个新的entity,将两个entity都放进去。这是最简单的,但是不够“优雅”。

第一种、第三种都感觉太麻烦了,我用了第二种:

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

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。

解决方法
一、手动设置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.bat(windows系统)或者catalina.sh(unix系统)

  1. windows系统 在 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系统 在 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里面同样设置内存大小

MyEclipse启动 参考文章

举报

相关推荐

0 条评论