博客为项目的ReadMe文件间歇性同步,实时更新与代码参考GitHub链接

Spring实战(第5版) 练习项目

写在前面:这本书非常不推荐Spring新手看,甚至没有工作经验的同学都不建议观看,一是作者对代码极不负责任,很多改动都不在书中写而是偷偷地改,导致自己跟着书搭建时踩坑无数,二是这本书属于新技术的讲解,对于入门Spring或者加深Spring使用技巧的意义都很低。
换句话说,这本书从第1部分Spring基础之后就可以放着了,后面的内容全是大坑并且意义真的不大,肺腑之言—2021.08.13

项目简介:跟随Spring实战第5版,使用SpringBoot自己搭建的TacoCloud项目。

项目特点:

  1. 从第3章开始就使用工程通用的MySql数据库搭建持久层,而非书本的H2(从第6章开始变回了H2,否则实在无法跑通作者代码);
  2. 对书本中的诸多问题进行文字和项目的填坑记录,给予其他同学一定地填坑帮助;
  3. 从第六章开始,把每章自己调试OK的项目单独拉分支存储,便于后续按章调整,也便于填坑对照参考。

项目规划:

  1. 边学习边搭建,但考虑到作者对自己历史代码的改动“极不负责任”,所以在完成这本书的核心内容学习之前,不会对代码做过多个人风格的调整;
  2. 保证每章学习完成后,项目能保证之前章节的流程正常跑通,并通过当前章节作者所书写的UT。

项目吐槽(自由发挥空间):

  1. 这本书行文很烂,实践和书本表达脱节严重,大量代码在GitHub中改了,但是书上只字未提。如果是选择像我这样自己跟着书本从头搭建项目,会吃不少苦头,基本每章都需要仔细地看哪些类在GitHub中改过,然后更新代码;
  2. 使用了工程环境不可能使用的H2数据库和很少使用的thymeleaf,和实际工作脱节较为严重,只存在一定的参考作用。

填坑记录(填坑历史可查代码提交记录)

当前进展:第7章功能自测完成,UT由于作者自己未保证故放弃(至此弃坑,填不填以后再说)。

基础原则1:每章的代码跟着看完+打完->对照GitHub复查缺失或直接CV大法->开始调试,前面两步骤如果没做好会让人浪费很多时间在无意义的调试上。

第1章 Spring起步

  1. 通常都是使用IDEA进行Java编码,所以需要先搞定IDEA的破解或注册;
  2. 1.2.2节的pom.xml先较于作者GitHub代码存在缺失,建议去参考补充下;
  3. 作者的各个html都不加图片src,导致直接在idea中打开无法加载图;
  4. 自动编译功能:打开idea的自动编译->项目启动后随便修改什么再点构建(Ctrl+F9也OK)

第2章 开发Web应用

  1. 作者的各种html直接复制也会标红报错,莫慌,正常现象,不影响用;
  2. 作者会偷偷改各个html,务必对照,不要问我怎么知道的;
  3. 秉持基础原则1;

第3章 使用数据

  1. 如果使用最新版本的SpringBoot,H2数据库在IDEA中配置会很困难。这里是一个很大的分歧点,要么竭尽所能去配置好H2数据库,要么和我一样使用更工程性质的MySql(这里务必提个醒,使用MySql的话,前方的荆棘会更多,但也会更爽)
  2. 作者会偷偷把Taco类的ingredients改成List,此乃第3章第一大坑,务必同步加入IngredientByIdConverter类,代码参考GitHub;
  3. 作者会偷偷改各个html,务必对照,秉持基础原则1;
  4. JDBC阶段,使用MySql的话,Ingredient库在存储时id会按照字母排序,导致无法过作者的UT,此时可加入pid作为自增主键保证该表存储顺序为插入数据,以过UT;
  5. JPA阶段,JPA的改造建议跟在这里做了,Repository相关接口的调整也都跟着在这章做了,后面作者都会用JPA,JDBC的东西别留恋,能删就删了,尤其那俩sql文件;
  6. JPA阶段,JPA如果要存储在本地MySql需要做一些配置,可以参考我的application.properties,或者自己百度;
  7. JPA阶段,JPA+MySql同样存在存储时id会按照字母排序导致无法过作者UT的问题,此时可以在Ingredient实体类中新增pid主键,并同步手动改写IngredientRepository中的findById方法保证从id查Ingredient而不是从pid查。

第4章 保护Spring

  1. 最后会选用基于JPA的方式,其他基于的方式该干掉干掉,之后会有启动影响,前面建议第3章把JPA的坑踩完也是这个原因;
  2. 作者会偷偷把DesignTacoController中taco()的模型名改成design,Order类中大量字段改名,最后又偷偷把所有html全改了,务必秉持基础原则1;
  3. 这章作者的UT每次启动都会塞数据,所以想过作者的UT就务必配置spring.jpa.hibernate.ddl-auto=create,保证每次的数据都是新的,尽量不要自己玩花的。玩花的可以先试一试再删掉,因为作者的UT卡的非常死。

第5章 使用配置属性

  1. pom中新增spring-boot-configuration-processor,否则会报springboot配置注解处理器没有找到;
  2. 元数据json和props中会报重新运行SPRING BOOT CONFIGURATION ANNOTATION PROCESSOR来更新生成的元数据,可管可不管,想管上StackOverFlow查;
  3. 作者加了个orderList.html,秉持原则1补上;
  4. 作者新增了discount相关的一系列控制器、配置项和html,对第5章而言没什么实际作用,但是属于后面章节的铺垫,建议秉持原则1在这节都加上;
  5. application.properties和application.yml可以同时配置,如果习惯前者可以把适合在yml中配的迁移过去。

第6章 创建REST服务

  1. 第6章的变动及其之大,直接将以前的1个模块变成了7个,这是作者极不负责任的表现,当然这么喷也没意义,该填的坑还是的填。同时从这章开始,每章都会单独起分支,便于以后按章节调整;
  2. 鉴于作者本次改动量过大,建议直接根据ch06的源代码进行CV大法完成项目重构。项目重构中有几个重点问题如下:
    1. 为了保证迁移的准确性,最好直接完全复制作者的源代码;
    2. 使用IDEA的话,ui和tacos模块自动导入时存在解析错误,最好手动导入这两个模块;
    3. 需要保证项目的JDK为1.8,如果不是无法启动项目,会报错;
    4. 截止2021.08.09,即使直接复制作者代码+正确的1.8版本也会无法启动代码,报hibernate-validator中类缺失的问题,原因是hibernate-validator和hibernate-core版本不一致,最好将子类中所有validator新版本排掉,然后在父parent pom中加core对应的5.2.2版本‘
    5. 这一章的,或者从第6章开始项目的目的是提供后端的api接口,保证数据提供,所以不会像前5章一样做多页的html界面;
  3. 这章也是找到了为什么IDEA一直起不来H2数据库的终极原因,有两点:
    1. H2的数据库需要本地起H2 Console后再在右下角任务栏右键H2图标创建数据库才行,否则无法连接(以后每次启动项目前都要记得手动启动H2);
    2. IDEA使用的H2数据库版本是1.4.200和1.4.196,然后截止2021.08.11,项目中的H2数据库版本为1.4.197,和idea支持的两个版本无法完全对应,导致数据一写入就读取失败。这里需要手动调整项目的H2数据库版本为200或者196。
    3. 配置中方言配置为spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
    4. 如果选择内存加载方式可以保证每次启动没问题,但是存在无法直观查看表中数据的问题;所以最好选择tcp方式建表,并调整ddl-auto为update,保证数据持久并能多次启动使用;
  4. SpringDataRestConfiguration里的匿名类如果修改为lambda表达式后,api功能都将会无效,所以最好别动;
  5. 这一章的UT已经名存实亡,就当看个笑话吧,作者的第6章最大问题就是步子迈地太大了,一下子没法顾得上之前的各种设计了;
  6. 这一章的tacocloud-ui模块都是前端内容,截止2021.08.11有一些加载问题,选择放着不去解决。

第7章 消费REST服务

  1. 这章很短,讲了如何通过RestTemplate和Traverson实现RestApi的消费,但是书上没有任何例子,其实具体到代码中就是新增了tacocloud-restclient模块;
  2. 这章的UT也是个笑话,注意作者167页7.1.1节 Get资源的第一句话,“假设API没有实现HATEOAS”。我寻思大家都是第6章过来的,按照你的说法就还得把HATEOAS改掉呗,作者对自己以前代码的不负责任着实到了一种境界;
  3. 还是这章的UT,前半部分是非HATEOAS即不带API的,后半部分是HATEOAS带API,这UT能跑通就出了鬼了,至此彻底破防,对这本书的好感度基本降到冰点。
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐