搭建SpringBoot项目整合SSM框架问题汇总
1、java: 非法字符: '\ufeff'
解决方式:设置编码移除BOM
2、修改员工信息报错400
控制台报错
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错误 或者 资源过滤问题
- 检查配置文件绑定地址
我这里修改时粗心写错了才导致报错,正确格式如下:
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:
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>
当资源成功被扫描到后,在运行之后会在输出目录生成相应的文件,如下图: