前言
最近接受了实验室的老项目,用的前后端不分离那一套,主要技术栈是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);
|
这是报错的信息,id
和where
连起来了
这是纠正后的,比较蠢的问题
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对我的大力帮助,没有他,代码写不了一点