Spring Boot问题汇总

标签: Springboot 分类: Java 创建时间:2020-02-26 09:32:51 更新时间:2024-11-15 10:49:43

1.RequestMapping出现404错误

遇到一个奇葩的问题。就是同一个RequestMapping,在不加参数的时候能正常进入函数,但是加了参数之后,就显示404错误。

加了page之后:

使用了postwoman也是出现了无法获取参数的问题。最后解决的问题,是因为在问号之前有了一个换行,把这个换行删掉之后就可以了。

还有需要注意的是使用@RequestParam获取参数,请求头的Content-Type应该为:application/x-www-form-urlencoded。

2.must be “pom” but is “jar”

自己新建一个具有子工程的maven项目的时候,出现了无法打包的问题。

解决方法是在父pom.xml中的project节点中添加如下内容。

1
<packaging>pom</packaging>

3.target\surefire-reports for the individual test results

在执行mvn clean package命令之后出现了这个问题。

(1) 注释掉自动生成的测试代码,直接将自动生成的测试代码注释掉,加入自己的测试代码。

(2) 在pom中加入代码,使得测试错误不影响项目编译。

1
2
3
4
5
6
7
8
9
10
11
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
</plugins>
</build>

4.cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest

我在程序中使用了@Autowired自动注入的方式提供了request对象

1
2
@Autowired
private HttpServletRequest request;

但是在我使用MultipartHttpServletRequest将request强制转换为MultipartHttpServletRequest时,服务器报错了。

1
List<MultipartFile> listResume = ((MultipartHttpServletRequest)request).getFiles("file");

后来添加 了commons-fileupload的Maven依赖,尝试使用了CommonsMultipartResolver进行转换,结果虽然也没有报错,但是还是无法获取文件,最后使用了StandardServletMultipartResolver进行转换,正确的获取到了相关文件。

1
2
3
4
5
6
7
8
9
@Autowired
private HttpServletRequest request;

public void test()
{
MultipartResolver resolver = new StandardServletMultipartResolver();
MultipartHttpServletRequest multipartHttpServletRequest=resolver.resolveMultipart(request);
List<MultipartFile> listResume = multipartHttpServletRequest.getFiles("file");
}

5.java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory

1
2
MultipartResolver resolver = new CommonsMultipartResolver();
MultipartHttpServletRequest multipartHttpServletRequest=resolver.resolveMultipart(request);

在编写上面的代码的时,主要是将HttpServletRequest转为MultipartHttpServletRequest时使用。出现了NoClassDefFoundError错误。只需要添加如下的依赖就可以了。

1
2
3
4
5
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</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里面的内容是一个对象,这样的情况下后台也是有可能无法接收到的。

7.HikariPool-2 - Connection is not available, request timed out after 30001ms

这篇文章纯属于一个探讨的内容,在我学习SpringBoot的过程中,遇到了各种各样的问题,有些已经解决了,有些还没有解决,这个问题就是其中之一,具体问题产生的原因和产生的原理,也还是不是很清楚。具体的部分日志文件内容是这样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2019-04-22 00:00:11,638 ERROR [http-nio-8080-exec-2154] cn.zjdt.api.DataCtrl [DataCtrl.java : 314] updateMonitoring
org.springframework.dao.DataAccessResourceFailureException: Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:275)
....
Caused by: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48)
....
Caused by: java.sql.SQLTransientConnectionException: HikariPool-2 - Connection is not available, request timed out after 30001ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:676)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:190)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:155)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128)
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:106)

具体关注点是HikariPool-2 - Connection is not available, request timed out after 30001ms,根据参考文章描述,SpringBoot默认的连接池HikariCP,出现这种情况,主要是因为在并发请求中,大量的出现了更新操作,出现了大量“空闲连接”,导致了数据库连接池耗尽,从而出现连接队列中的剩余连接出现超时。从这个角度去思考,我的updateMonitoring操作中,确实是多个并发请求,并且内部有多次对数据的查询和两次的更新操作。原因有了,死马当活马医,那就是增大数据库连接数(spring.datasource.tomcat.max-active= 80),通过@Transactional注解将方法标记为事务性的。但是具体将数据库连接数设置为多少合适,以及将哪些方法标记为事务性的,如何正确配置HikariCP连接池,还有待探讨(关于数据库连接池的问题,这就触及到我知识的盲区了,手动惭愧.jpg)。

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class AliyunOssServiceImpl implements IAliyunOssService {
AliyunOssServiceImpl(){
this.createClient();
}
public void createClient() {
if (Objects.nonNull(this.ossClient)) {
return;
}
this.ossClient = new OSSClientBuilder()
.build(AliyunOssConfiguration.endpoint, AliyunOssConfiguration.accessKey, AliyunOssConfiguration.secretKey);
}
}
````

修改为
```java
public class AliyunOssServiceImpl implements IAliyunOssService {
private AliyunOssConfiguration aliyunOssConfiguration;

@Autowired
AliyunOssServiceImpl(AliyunOssConfiguration aliyunOssConfiguration){
if (Objects.nonNull(this.ossClient)) {
return;
}
this.aliyunOssConfiguration=aliyunOssConfiguration;
this.ossClient = new OSSClientBuilder()
.build(aliyunOssConfiguration.endpoint, aliyunOssConfiguration.accessKey, aliyunOssConfiguration.secretKey);
}
}
参考文章:
1.Access key id should not be null or empty. 这里说重新弄,这个我倒是不知道该如何重新弄才好。

11.找不到符号方法 isEmpty()

这个问题也是非常的奇怪,早前写代码的时候,明明没有问题,我还专门的回退了版本,到了可以运行的那个阶段,后来不知道怎么就出现了问题,主要就是 Optional deviceOpt 这个对象找不到 isEmpty 方法。

【尝试方法】
(1) 我尝试过重启Idea,尝试过回退版本,尝试过 清除缓存,甚至重启系统,都是无济于事。

(2) 我就是使用了 maven clean package 重新打包了一下,还是有问题。

【解决方案】
后来我还是解决了这个问题,就是在有问题的代码下面,鼠标放上去的时候,会有一个提示,我把语言级别选到了 11 以上,就好了。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。