前言

​ 最近接受了实验室的老项目,用的前后端不分离那一套,主要技术栈是SpringBoot+Thymeleaf+Layui。前后端都是自己搞,遇到了些奇奇怪怪的小问题(是我技术不到家),特此记录一下。

奇怪的问题

1. Mapper层写SQL时,前后的引号没用空格隔开导致SQL语句错误

这是最开始报错的语句,结果报错了,我从Controller层往下一个个查,到最后查SQL的时候才发现有问题。

1
2
3
4
5
6
7
@Select("select ${tableName}.*, si_patientsbaseinfo.*" +
"from ${tableName}" +
"left join si_patientsbaseinfo on ${tableName}.patientsId = si_patientsbaseinfo.id" +
"where ${where}" +
"order by ${orderby}" +
"LIMIT ${offset}, ${rows}")
List<Map> findByPageWithPatientId(@Param("tableName") String tableName, @Param("offset")int offset, @Param("rows")int rows, @Param("where")String where, @Param("orderby") String orderby);

这是报错的信息,idwhere连起来了

这是纠正后的,比较蠢的问题

1
2
3
4
5
6
7
@Select(" select ${tableName}.*, si_patientsbaseinfo.* " +
" from ${tableName} " +
" left join si_patientsbaseinfo on ${tableName}.patientsId = si_patientsbaseinfo.id " +
" where ${where} " +
" order by ${orderby} " +
" LIMIT ${offset}, ${rows} ")
List<Map> findByPageWithPatientId(@Param("tableName") String tableName, @Param("offset")int offset, @Param("rows")int rows, @Param("where")String where, @Param("orderby") String orderby);

2. 类上没加注解,导致返回的数据未序列化

最开始我是从系统页面发现的问题

然后因为数据是从request里取的,所以调debugger看数据

发现是从后端传来的数据就不对,对比发现少了个注解@JsonFormat,后面加上就没问题了

1
2
3
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date receptionTime;

3. 前端页面无法从request里获取数据

因为是在源代码上面基础缝缝补补,所以写的代码也是照猫画虎

下面是后端和前端的相关代码,就是查出数据然后放在request里面,然后前端再根据attribute的值拿到数据

1
2
3
4
5
6
7
8
9
10
@RequestMapping("/intoMedicalHistoryModify")
public String intoMedicalHistoryModify(HttpServletRequest request, Integer id) {
MedicalHistoryVO mvo = new MedicalHistoryVO();
mvo.setId(id);
mvo = this.medicalHistoryService.get(mvo);

request.setAttribute("mvo", mvo);
this.logOperation("进入修改病人病历界面", OperationType.GOTO, true);
return "web/patients/medicalHistory/medicalHistoryModify";
}
1
2
let mvo = [[${mvo}]];
form.val("form", mvo);

结果就是死活拿不到数据

给我好一顿找,最后还是对比了老代码,才发现是script标签少写了一个属性,后面加上就能拿到数据了

1
<script th:inline="javascript">

4. File类编码异常找不到文件

最开始的时候,是通过ResourceUtils.getURL()获取当前路径,再找到相应文件进行转码下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@GetMapping("/download/app")
@ResponseBody
public void downloadApp(HttpServletRequest request, HttpServletResponse response) {
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
//临时文件存储
String fdFile = ResourceUtils.getURL("classpath:").getPath() + "static/appFiles/currentApp";
File fd = new File(fdFile);
File file = null;
if (fd.exists()) {
File[] files = fd.listFiles();
if (null != files && files.length > 0) {
file = files[0];
}
}
...

在本地和另一台Linux服务器上测试过,都没有问题,但是放到Windows服务器上就出问题了。但是日志又没有报错,于是直接打印看看问题。

1
System.out.println("临时文件存储:" + fdFile);

打印的结果:

1
C:/Program%20Files/Apache%20Software%20Foundation/Tomcat%209.0/webapps/gaitsys/WEB-INF/classes/static/appFiles/currentApp

看到%就知道是什么问题了,没有编码为UTF-8,导致空格变成了%20,知道原因就可以解决了,加一句转码就行

1
fdFile = URLDecoder.decode(fdFile, "utf-8");

现在问题就解决了

5. SQL语句中含关键字

这个问题是给学弟改BUG发现的,报错不太详细,找半天才解决

问题就是,表中有个字段是rank,然后Mapper层的时候报错

解决办法就是把关键字用反引号 `` 引起来

特别鸣谢

​ 特别感谢chatGPT对我的大力帮助,没有他,代码写不了一点