Spring Boot问题汇总
1.RequestMapping出现404错误
遇到一个奇葩的问题。就是同一个RequestMapping,在不加参数的时候能正常进入函数,但是加了参数之后,就显示404错误。
加了page之后:
使用了postwoman也是出现了无法获取参数的问题。最后解决的问题,是因为在问号之前有了一个换行,把这个换行删掉之后就可以了。
还有需要注意的是使用@RequestParam获取参数,请求头的Content-Type应该为:application/x-www-form-urlencoded。
1.SpringMVC的@RequestMapping出现404的问题
2.springboot配置全局异常,并且处理404错误,返回自定义的格式
3.解决postman传参为中文报错400问题
4.@RequestParam无法获取参数
2.must be “pom” but is “jar”
自己新建一个具有子工程的maven项目的时候,出现了无法打包的问题。
解决方法是在父pom.xml中的project节点中添加如下内容。
1 | <packaging>pom</packaging> |
1.maven的pom文件报错: must be “pom” but is “jar”
2.Invalid packaging for parent pom.xml, must be “pom” but is “ear”
3.target\surefire-reports for the individual test results
在执行mvn clean package命令之后出现了这个问题。
(1) 注释掉自动生成的测试代码,直接将自动生成的测试代码注释掉,加入自己的测试代码。
(2) 在pom中加入代码,使得测试错误不影响项目编译。
1 | <build> |
1.解决:target\surefire-reports for the individual test results
2.maven跳过单元测试-maven.test.skip和skipTests的区别
3.maven打包时跳过测试
4.cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest
我在程序中使用了@Autowired自动注入的方式提供了request对象
1 |
|
但是在我使用MultipartHttpServletRequest将request强制转换为MultipartHttpServletRequest时,服务器报错了。
1 | List<MultipartFile> listResume = ((MultipartHttpServletRequest)request).getFiles("file"); |
后来添加 了commons-fileupload的Maven依赖,尝试使用了CommonsMultipartResolver进行转换,结果虽然也没有报错,但是还是无法获取文件,最后使用了StandardServletMultipartResolver进行转换,正确的获取到了相关文件。
1 |
|
1.SpringMVC文件上传报错org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest
2.Create MultipartHttpServletRequest then getting Exception
3.SpringBoot 文件上传实践
4.request如何转换MultipartHttpServletRequest?
5.Spring Boot通过Request获取上传文件的方法 (这篇文章比较有用)
6.Postman Post请求上传文件
5.java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory
1 | MultipartResolver resolver = new CommonsMultipartResolver(); |
在编写上面的代码的时,主要是将HttpServletRequest转为MultipartHttpServletRequest时使用。出现了NoClassDefFoundError错误。只需要添加如下的依赖就可以了。
1 | <dependency> |
6.springboot获取不到前台传入的参数
(1) 无论是试用@Requestparam还是request.getParameter()都获取不到前台传入的参数。主要原因可能是前台传递参数的时候,使用的是ContentType:application/json,实际上应该使用的是:application/x-www-form-urlencoded类型,如果非得要想用这种类型,就要使用@RequestBody或者是使用request.getInputStream()获取。
(2) 还有一种情况,前台虽然使用了application/x-www-form-urlencoded,但是post里面的内容是一个对象,这样的情况下后台也是有可能无法接收到的。
1.@RequestParam接收解析不到 POST 提交的 数据
2.java获取GET和POST请求参数 (这篇文章对getInputStream()以及getReader()及其应用场景进行了说明)
3.getParameter() getInputStream()和getReader() 区别
4.getInputStream与getReader方法
5.SpringBoot开发详解(五)–Controller接收参数以及参数校验
6.四种常见的 POST 提交数据方式 (这个对POST说明的比较多)
7.SpringBoot获取参数的几种方式
8.springboot 服务端获取前端传过来的参数7种方式 (这篇文章涵盖了多个方面)
7.HikariPool-2 - Connection is not available, request timed out after 30001ms
这篇文章纯属于一个探讨的内容,在我学习SpringBoot的过程中,遇到了各种各样的问题,有些已经解决了,有些还没有解决,这个问题就是其中之一,具体问题产生的原因和产生的原理,也还是不是很清楚。具体的部分日志文件内容是这样的。
1 | 2019-04-22 00:00:11,638 ERROR [http-nio-8080-exec-2154] cn.zjdt.api.DataCtrl [DataCtrl.java : 314] updateMonitoring |
具体关注点是HikariPool-2 - Connection is not available, request timed out after 30001ms,根据参考文章描述,SpringBoot默认的连接池HikariCP,出现这种情况,主要是因为在并发请求中,大量的出现了更新操作,出现了大量“空闲连接”,导致了数据库连接池耗尽,从而出现连接队列中的剩余连接出现超时。从这个角度去思考,我的updateMonitoring操作中,确实是多个并发请求,并且内部有多次对数据的查询和两次的更新操作。原因有了,死马当活马医,那就是增大数据库连接数(spring.datasource.tomcat.max-active= 80),通过@Transactional注解将方法标记为事务性的。但是具体将数据库连接数设置为多少合适,以及将哪些方法标记为事务性的,如何正确配置HikariCP连接池,还有待探讨(关于数据库连接池的问题,这就触及到我知识的盲区了,手动惭愧.jpg)。
1.JavaWeb问题集锦: 数据库连接池请求超时 HikariPool-1
2.java – Spring-Boot:如何设置JDBC池属性,如最大连接数?
3.HikariCP - connection is not available
4.springBoot数据库连接池常用配置
5.MySQL调优基础, 与hikari数据库连接池配合
6.Spring Boot之默认连接池配置策略
7.Spring Boot之默认连接池配置策略
8.数据库连接池的实现及原理
9.springboot 连接池wait_timeout超时设置
10.HikariCP连接池及其在springboot中的配置
11.springBoot数据库连接池常用配置
8.Java heap space
常见的有以下几种:
(1) 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
(2) 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
(3) 代码中存在死循环或循环产生过多重复的对象实体;
(4) 使用的第三方软件中的BUG;
(5) 启动参数内存值设定的过小;
9.Refactor the configuration such that CachingConfigurer is implemented only once or not at all.
问题出现在我改造jeecg-boot,和自己的模块的时候,出现了冲突。问题的原因其实就是 jeecg-boot 也实现了 CachingConfigurerSupport,我决定把自己的进行注释掉。
1.Spring Boot 项目启动排除一些配置类 spring中允许使用默认的cacheManager,但是不允许同时存在两个,那就在启动类上使用注解过滤不需要重复的文件,关键代码如下。
2.Springboot整合redis(Redisson、Jedis等)缓存项目启动故障,注解 缓存失效解决方案 主动向容器添加Redisson时优先使用用户创建,
若用户放入容器的客户端实现CachingConfigurer接口,与此同时配置类加上@EnableCaching,则为接口创建代理对象时出现多个实现类而抛出异常。解决办法:二选一
10.com.aliyun.oss.common.auth.InvalidCredentialsException: Access key id should not be null or empty
这个问题真是奇了怪了,我在本地测试好好的,到服务器上运行,就死活通不过,无论是开发环境还是正式环境,都报这个错误: “ Failed to instantiate [com.openmap.drone.configuration.oss.AliyunOssServiceImpl]: Constructor threw exception; nested exception is com.aliyun.oss.common.auth.InvalidCredentialsException: Access key id should not be null or empty.”
【问题描述】
(1)在idea中调试好的,但是打包之后,直接运行jar文件,就是无法通过。
【问题解决】
这个问题主要就是注入的时机不对,就是要用构造函数注入,不能直接调用函数。之所以在Idea中调试的时候没有问题,到了打包的时候有问题,是因为调试的时候,程序运行的慢,导致提前注入进去了,打包之后出现问题,就是可能 AliyunOssConfiguration 这个类注入的时机没有达到。
1 | public class AliyunOssServiceImpl implements IAliyunOssService { |
1.Access key id should not be null or empty. 这里说重新弄,这个我倒是不知道该如何重新弄才好。
11.找不到符号方法 isEmpty()
这个问题也是非常的奇怪,早前写代码的时候,明明没有问题,我还专门的回退了版本,到了可以运行的那个阶段,后来不知道怎么就出现了问题,主要就是 Optional
【尝试方法】
(1) 我尝试过重启Idea,尝试过回退版本,尝试过 清除缓存,甚至重启系统,都是无济于事。
(2) 我就是使用了 maven clean package 重新打包了一下,还是有问题。
【解决方案】
后来我还是解决了这个问题,就是在有问题的代码下面,鼠标放上去的时候,会有一个提示,我把语言级别选到了 11 以上,就好了。
1.idea项目找不到符号