个人主页:BoBooY的CSDN博客_Java领域博主 报错项目来源参考: SpringBoot员工管理系统(无数据库):https://blog.csdn.net/qq_58233406/article/details/126837617 SpringBoot员工管理系统(有数据库):https://blog.csdn.net/qq_58233406/article/details/127174418 文章目录
- 搭建SpringBoot项目整合SSM框架问题汇总
- 1、java: 非法字符: 'ufeff'
- 2、修改员工信息报错400
- 3、配置了数据源,但是自动注入时还是爆红
- 4、Caused by: org.xml.sax.SAXParseException: 前言中不允许有内容。
- 5、Caused by: java.io.FileNotFoundException: class path resource [mybatis/mapper/*.xml] cannot be opened because it does not exist
- 6、未找到mapper绑定的xml配置文件
- 7、数据源 url 的数据库在练习时也容易填错
- 8、关于设计数据库表字段是否自动递增的问题
- 9、扫描不到 yaml 配置文件
- 10、用户登录报空指针异常
- 11、Mybatis 多对一 结果映射失败
- 12、localhost 将您重定向的次数过多
- 13、查询Department 可以获取id 不能获取 部门名称 departmentName
- 14、前端传给后端数据类型是对象的时候,会自动转为字符串String类型
- 15、使用PostMapping和DeleteMapping处理删除删除数据的请求报错405
搭建SpringBoot项目整合SSM框架问题汇总
1、java: 非法字符: ‘ufeff’
解决方式:设置编码移除BOM
2、修改员工信息报错400
代码语言:javascript复制控制台报错
2022-09-12 15:49:39.658 WARN 18724 --- [nio-8080-exec-6]
.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.validation.BindException:
org.springframework.validation.BeanPropertyBindingResult: 1
errors<EOL>Field error in object 'employee' on field 'birth':
rejected value [2022-10-12 15:49]; codes
[typeMismatch.employee.birth,typeMismatch.birth,typeMismatch.java.
util.Date,typeMismatch]; arguments
[org.springframework.context.support.DefaultMessageSourceResolvabl
e: codes [employee.birth,birth]; arguments []; default message
[birth]]; default message [**Failed to convert property value of
type 'java.lang.String' to required type 'java.util.Date' for
property 'birth'**; nested exception is
org.springframework.core.convert.ConversionFailedException: Failed
to convert from type [java.lang.String] to type [java.util.Date]
for value '2022-10-12 15:49'; nested exception is
java.lang.IllegalArgumentException: Parse attempt failed for value
[2022-10-12 15:49]]]
大概意思是:日期在转换时 格式错误 String类型无法转换成Util.Date类型
网页报错
解决问题
- springboot默认日期格式为:2018-06-17T07:24:07.430 0000。
- springboot在配置文件中可以修改日期格式
- 日期格式转换出现问题,检查前端页面传来的日期格式和后端能接受日期格式
按照上图所示,后端配置的日期格式为:yyyy-MM-dd hh:mm
查看前端update页面设置的日期格式:yyyy-MM-dd HH:mm
由此可以发现 HH 和 hh格式不一样,才导致了错误
HH:24小时制
hh: 12小时制
- 修改后端配置文件中的日期格式与前端保持一致即可解决问题
补充
- 在实体类的字段上方加如下注解也可实现自定义日期格式
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
3、配置了数据源,但是自动注入时还是爆红
原因:未知
解决方式:降低springboot版本
原版本2.7.3:
改为2.6.11:
4、Caused by: org.xml.sax.SAXParseException: 前言中不允许有内容。
报错原因:application.properties中没有配置mybatis.mapper-locations或者路径写错
解决方式:
- 正确格式如下
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
5、Caused by: java.io.FileNotFoundException: class path resource mybatis/mapper/*.xml cannot be opened because it does not exist
- 报错如下:
- 配置了mapper的配置文件路径但还是报错说文件不存在
注意:细节 locations 和 location 少了个 's’是不一样的
- 正确的格式如下:
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
6、未找到mapper绑定的xml配置文件
- 报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.springboot07mybatis.mapper.UserMapper.getUserList
- 百度翻译:无效的绑定语句(未找到):com.springboot07mybatis.mapper.UserMapper.getUserList
查找错误根源:配置文件绑定地址错误 或者 mapper的namespace错误 或者 资源过滤问题
- 检查配置文件绑定地址
我这里修改时粗心写错了才导致报错,正确格式如下:
代码语言:javascript复制mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
- 检查mapper的namespace
我这里是正确的
- Maven过滤问题添加如下代码:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
添加后运行检查输出路径 是否有xml文件在指定的路径中,如下图:
往往这几处没有问题了,基本就不会报错了。
7、数据源 url 的数据库在练习时也容易填错
- 报错:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘springboot.user’ doesn’t exist at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~na:1.8.0_292 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~na:1.8.0_292 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~na:1.8.0_292 at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~na:1.8.0_292
分析:练习时复制以前的写过的url地址,忘记更改数据库了
我这里应该是 mybatis 数据库,都是粗心啊兄弟们!!!
完整 mysql 5.1.47 url:
代码语言:javascript复制spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
ps:有的时候一个小错就会找半天,还找不到错误的原因,不过没关系,不要上头,要冷静分析,冷静不了就出去散散心,然后回来慢慢一点点的查找错误(心得呀都是,不回女朋友信息就是在嘎嘎修bug)
8、关于设计数据库表字段是否自动递增的问题
如果数据库
id
字段没有设计自动递增,并且添加信息语句中也没有id
字段会怎样?
不出意外,肯定会报错,报错信息如下:
Cause: java.sql.SQLException: Field ‘id’ doesn’t have a default value
; Field ‘id’ doesn’t have a default value; nested exception is java.sql.SQLException: Field ‘id’ doesn’t have a default value] with root cause
java.sql.SQLException: Field ‘id’ doesn’t have a default value
两种解决方式
- 第一种:设计自动递增(推荐)
原因:因为大多数时候我们让添加信息的业务都是用户填写相关信息,而id
都是隐藏起来的不会让用户填写
- 第二种:在添加信息的sql语句中添加
id
字段,可以自己练习的时候使用,开发项目就不建议了
原因:如上
9、扫描不到 yaml 配置文件
报错:Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
原因:maven资源过滤问题
解决方式
添加如下代码:(注意区别,这里的资源过滤 添加了对**yml
** /**yaml
**格式文件的支持)
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
<include>**/*.yaml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
<include>**/*.yaml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
当资源成功被扫描到后,在运行之后会在输出目录生成相应的文件,如下图:
10、用户登录报空指针异常
报错信息:java.lang.NullPointerException: null
at com.bobooy.ems.controller.UserController.login(UserController.java:25)。。。。。
分析:报错原因,用户名填写错误会导致从数据库中通过用户名查找用户信息会查不到这个用户,所以在user.getUserName()就会报空指针异常
解决办法:在Controller中添加一个对用户是否为空的判断
11、Mybatis 多对一 结果映射失败
报错:ERROR 25928 — io-8080-exec-10 o.a.c.c.C.[.[./.dispatcherServlet : Servlet.service() for servlet dispatcherServlet in context with path [] threw exception Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: **Could not set property ‘department’ of ‘class com.bobooy.ems.pojo.Employee’ with value ‘Department(id=101, departmentName=技术部)’ Cause: java.lang.IllegalArgumentException: argument type mismatch with root cause**
大概意思:在结果映射时属性和结果的类型不匹配,无法进行结果集映射
解决方式:修改Department这个关联属性的类型
原类型:
修改为:Department类型
12、localhost 将您重定向的次数过多
网页报错:该网页无法正常运作 localhost 将您重定向的次数过多。尝试清除 Cookie ERR_TOO_MANY_REDIRECTS
报错起因:设置了登录拦截之后,登录发生上述异常。
报错根本原因:在设置了登录拦截器并且判断可以放行的时候再次使用了重定向到主页面,导致登录拦截有一次重定向到主页,正常登录也有一次重定向到主页,所以两者发生了冲突,代码如下:
- 登陆拦截器
- 正常登录(UserController)
解决方式:删除登录拦截的重定向代码即可
13、查询Department 可以获取id 不能获取 部门名称 departmentName
测试查看:
分析原因:实体类中Department的属性部门名为 departmentName
而数据库中部门名字段为department_Name
,这就会导致结果映射不成功
解决方式:
方式一:查询语句改为
代码语言:javascript复制select `id`,`department_name` as departmentName from department;
方式二:开启 Mybatis 驼峰命名映射 在application.yaml文件中配置 注意空格
代码语言:javascript复制 configuration:
map-underscore-to-camel-case: true #开启驼峰命名
14、前端传给后端数据类型是对象的时候,会自动转为字符串String类型
报错:
代码语言:javascript复制WARN 25360 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved
[org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1
errors<EOL>Field error in object 'employee' on field 'department': rejected value [101]; codes
[typeMismatch.employee.department,typeMismatch.department,typeMismatch.com.bobooy.ems.pojo.Department,typeMismatch];
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes
[employee.department,department]; arguments []; default message [department]]; default message [Failed to convert
property value of type 'java.lang.String' to required type 'com.bobooy.ems.pojo.Department' for property
'department'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String'
to required type 'com.bobooy.ems.pojo.Department' for property 'department': no matching editors or conversion
strategy found]]
Cannot convert value of type ‘java.lang.String’ to required type ‘com.bobooy.ems.pojo.Department’ for property ‘department’
大致意思:不能将字符类型转换为Department类型
错误来源:
数据库表多对一进行 添加员工 的时候,前端传department给后端,但后端报错类型不匹配
- 前端如下:
- 后端接收
解决方式:前端传一个int类型的值,将 department 换成 department.id,这样这个数据传入到后端,数据类型是String通过Mybatis将参数自动转换为int类型,就不会出现类型不匹配的问题
补充:后端可以将复杂的数据类型(如:数组,对象,集合)传给前端并完好的接收,但前端传给后端的只能是字符串(这里抛开使用JSON进行前后端数据交互)
15、使用PostMapping和DeleteMapping处理删除删除数据的请求报错405
报错:网页报错 405(There was an unexpected error (type=Method Not Allowed, status=405).)
代码:
- 前端:
- 后端
分析原因:
1.通过网上查阅资料,SpringBoot2.0以上版本没有启用HiddenHttpMethodFilter
过滤器,不能将post转换为delete请求,需要在主配置文件中开启过滤器
2.但本次核心错误原因是前端使用a标签href链接发送的是Get请求,所以后端处理请求只能使用GetMapping或者RequestMapping
第一个问题的解决方式:配置文件中添加如下配置
代码语言:javascript复制spring.mvc.hiddenmethod.filter.enabled=true
第二个问题的解决方式(本次核心问题):
将controller使用GetMapping或者RequestMapping来处理请求
尾言:本篇文章将持续更新,记录在搭建类似项目时遇到的各类报错问题和解决方式。创作不易,如果本文的内容对您有帮助,还望客官可以三连支持一下博主,