Spring实战(第5版)个人项目与填坑记录
博客为项目的ReadMe文件间歇性同步,实时更新与代码参考GitHub链接Spring实战(第5版) 练习项目项目简介:跟随Spring实战第5版,使用SpringBoot自己搭建的TacoCloud项目。项目特点:从第3章开始就使用工程通用的MySql数据库搭建持久层,而非书本的H2;对书本中的诸多问题进行填坑记录,给予其他同学一定地填坑帮助;其他基本和书本一致, 没啥其他特点了(笑)。项目规划
·
博客为项目的ReadMe文件间歇性同步,实时更新与代码参考GitHub链接
Spring实战(第5版) 练习项目
写在前面:这本书非常不推荐Spring新手看,甚至没有工作经验的同学都不建议观看,一是作者对代码极不负责任,很多改动都不在书中写而是偷偷地改,导致自己跟着书搭建时踩坑无数,二是这本书属于新技术的讲解,对于入门Spring或者加深Spring使用技巧的意义都很低。
换句话说,这本书从第1部分Spring基础之后就可以放着了,后面的内容全是大坑并且意义真的不大,肺腑之言—2021.08.13
项目简介:跟随Spring实战第5版,使用SpringBoot自己搭建的TacoCloud项目。
项目特点:
- 从第3章开始就使用工程通用的MySql数据库搭建持久层,而非书本的H2(从第6章开始变回了H2,否则实在无法跑通作者代码);
- 对书本中的诸多问题进行文字和项目的填坑记录,给予其他同学一定地填坑帮助;
- 从第六章开始,把每章自己调试OK的项目单独拉分支存储,便于后续按章调整,也便于填坑对照参考。
项目规划:
- 边学习边搭建,但考虑到作者对自己历史代码的改动“极不负责任”,所以在完成这本书的核心内容学习之前,不会对代码做过多个人风格的调整;
- 保证每章学习完成后,项目能保证之前章节的流程正常跑通,并通过当前章节作者所书写的UT。
项目吐槽(自由发挥空间):
- 这本书行文很烂,实践和书本表达脱节严重,大量代码在GitHub中改了,但是书上只字未提。如果是选择像我这样自己跟着书本从头搭建项目,会吃不少苦头,基本每章都需要仔细地看哪些类在GitHub中改过,然后更新代码;
- 使用了工程环境不可能使用的H2数据库和很少使用的thymeleaf,和实际工作脱节较为严重,只存在一定的参考作用。
填坑记录(填坑历史可查代码提交记录)
当前进展:第7章功能自测完成,UT由于作者自己未保证故放弃(至此弃坑,填不填以后再说)。
基础原则1:每章的代码跟着看完+打完->对照GitHub复查缺失或直接CV大法->开始调试,前面两步骤如果没做好会让人浪费很多时间在无意义的调试上。
第1章 Spring起步
- 通常都是使用IDEA进行Java编码,所以需要先搞定IDEA的破解或注册;
- 1.2.2节的pom.xml先较于作者GitHub代码存在缺失,建议去参考补充下;
- 作者的各个html都不加图片src,导致直接在idea中打开无法加载图;
- 自动编译功能:打开idea的自动编译->项目启动后随便修改什么再点构建(Ctrl+F9也OK)
第2章 开发Web应用
- 作者的各种html直接复制也会标红报错,莫慌,正常现象,不影响用;
- 作者会偷偷改各个html,务必对照,不要问我怎么知道的;
- 秉持基础原则1;
第3章 使用数据
- 如果使用最新版本的SpringBoot,H2数据库在IDEA中配置会很困难。这里是一个很大的分歧点,要么竭尽所能去配置好H2数据库,要么和我一样使用更工程性质的MySql(这里务必提个醒,使用MySql的话,前方的荆棘会更多,但也会更爽)
- 作者会偷偷把Taco类的ingredients改成List,此乃第3章第一大坑,务必同步加入IngredientByIdConverter类,代码参考GitHub;
- 作者会偷偷改各个html,务必对照,秉持基础原则1;
- JDBC阶段,使用MySql的话,Ingredient库在存储时id会按照字母排序,导致无法过作者的UT,此时可加入pid作为自增主键保证该表存储顺序为插入数据,以过UT;
- JPA阶段,JPA的改造建议跟在这里做了,Repository相关接口的调整也都跟着在这章做了,后面作者都会用JPA,JDBC的东西别留恋,能删就删了,尤其那俩sql文件;
- JPA阶段,JPA如果要存储在本地MySql需要做一些配置,可以参考我的application.properties,或者自己百度;
- JPA阶段,JPA+MySql同样存在存储时id会按照字母排序导致无法过作者UT的问题,此时可以在Ingredient实体类中新增pid主键,并同步手动改写IngredientRepository中的findById方法保证从id查Ingredient而不是从pid查。
第4章 保护Spring
- 最后会选用基于JPA的方式,其他基于的方式该干掉干掉,之后会有启动影响,前面建议第3章把JPA的坑踩完也是这个原因;
- 作者会偷偷把DesignTacoController中taco()的模型名改成design,Order类中大量字段改名,最后又偷偷把所有html全改了,务必秉持基础原则1;
- 这章作者的UT每次启动都会塞数据,所以想过作者的UT就务必配置spring.jpa.hibernate.ddl-auto=create,保证每次的数据都是新的,尽量不要自己玩花的。玩花的可以先试一试再删掉,因为作者的UT卡的非常死。
第5章 使用配置属性
- pom中新增spring-boot-configuration-processor,否则会报springboot配置注解处理器没有找到;
- 元数据json和props中会报重新运行SPRING BOOT CONFIGURATION ANNOTATION PROCESSOR来更新生成的元数据,可管可不管,想管上StackOverFlow查;
- 作者加了个orderList.html,秉持原则1补上;
- 作者新增了discount相关的一系列控制器、配置项和html,对第5章而言没什么实际作用,但是属于后面章节的铺垫,建议秉持原则1在这节都加上;
- application.properties和application.yml可以同时配置,如果习惯前者可以把适合在yml中配的迁移过去。
第6章 创建REST服务
- 第6章的变动及其之大,直接将以前的1个模块变成了7个,这是作者极不负责任的表现,当然这么喷也没意义,该填的坑还是的填。同时从这章开始,每章都会单独起分支,便于以后按章节调整;
- 鉴于作者本次改动量过大,建议直接根据ch06的源代码进行CV大法完成项目重构。项目重构中有几个重点问题如下:
- 为了保证迁移的准确性,最好直接完全复制作者的源代码;
- 使用IDEA的话,ui和tacos模块自动导入时存在解析错误,最好手动导入这两个模块;
- 需要保证项目的JDK为1.8,如果不是无法启动项目,会报错;
- 截止2021.08.09,即使直接复制作者代码+正确的1.8版本也会无法启动代码,报hibernate-validator中类缺失的问题,原因是hibernate-validator和hibernate-core版本不一致,最好将子类中所有validator新版本排掉,然后在父parent pom中加core对应的5.2.2版本‘
- 这一章的,或者从第6章开始项目的目的是提供后端的api接口,保证数据提供,所以不会像前5章一样做多页的html界面;
- 这章也是找到了为什么IDEA一直起不来H2数据库的终极原因,有两点:
- H2的数据库需要本地起H2 Console后再在右下角任务栏右键H2图标创建数据库才行,否则无法连接(以后每次启动项目前都要记得手动启动H2);
- IDEA使用的H2数据库版本是1.4.200和1.4.196,然后截止2021.08.11,项目中的H2数据库版本为1.4.197,和idea支持的两个版本无法完全对应,导致数据一写入就读取失败。这里需要手动调整项目的H2数据库版本为200或者196。
- 配置中方言配置为spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
- 如果选择内存加载方式可以保证每次启动没问题,但是存在无法直观查看表中数据的问题;所以最好选择tcp方式建表,并调整ddl-auto为update,保证数据持久并能多次启动使用;
- SpringDataRestConfiguration里的匿名类如果修改为lambda表达式后,api功能都将会无效,所以最好别动;
- 这一章的UT已经名存实亡,就当看个笑话吧,作者的第6章最大问题就是步子迈地太大了,一下子没法顾得上之前的各种设计了;
- 这一章的tacocloud-ui模块都是前端内容,截止2021.08.11有一些加载问题,选择放着不去解决。
第7章 消费REST服务
- 这章很短,讲了如何通过RestTemplate和Traverson实现RestApi的消费,但是书上没有任何例子,其实具体到代码中就是新增了tacocloud-restclient模块;
- 这章的UT也是个笑话,注意作者167页7.1.1节 Get资源的第一句话,“假设API没有实现HATEOAS”。我寻思大家都是第6章过来的,按照你的说法就还得把HATEOAS改掉呗,作者对自己以前代码的不负责任着实到了一种境界;
- 还是这章的UT,前半部分是非HATEOAS即不带API的,后半部分是HATEOAS带API,这UT能跑通就出了鬼了,至此彻底破防,对这本书的好感度基本降到冰点。
更多推荐
已为社区贡献1条内容
所有评论(0)