[{"data":1,"prerenderedAt":27},["ShallowReactive",2],{"article-spring-boot-4-upgrade":3},{"id":4,"title":5,"slug":6,"summary":7,"coverUrl":8,"contentFormat":9,"contentHtml":10,"viewCount":11,"publishTime":12,"updateTime":13,"seoTitle":5,"seoDescription":7,"tags":14,"next":22,"highlighted":26},"1","Spring Boot 4 升级踩坑记：三个会让你编译不过的变更","spring-boot-4-upgrade","从 Boot 3 升到 4 不是改个版本号就完事。我实际踩到的三个坑，按\"会让你编译不过\"的程度排序。 一、and() 被移除 Spring Security 7 把链式调用的 and() 从整个 builder 层级删掉了，旧写法直接编译…","","markdown","\u003Cp>从 Boot 3 升到 4 不是改个版本号就完事。我实际踩到的三个坑，按\"会让你编译不过\"的程度排序。\u003C\u002Fp>\n\u003Ch2>一、\u003Ccode>and()\u003C\u002Fcode> 被移除\u003C\u002Fh2>\n\u003Cp>Spring Security 7 把链式调用的 \u003Ccode>and()\u003C\u002Fcode> 从整个 builder 层级删掉了，旧写法直接编译失败：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-java\">\u002F\u002F ❌ 编译不过\nhttp.csrf().disable().authorizeRequests()...\n\n\u002F\u002F ✅ 只能 lambda DSL\nhttp.csrf(csrf -&gt; csrf.disable())\n    .authorizeHttpRequests(auth -&gt; auth.anyRequest().authenticated());\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>二、测试 starter 被拆开\u003C\u002Fh2>\n\u003Cp>\u003Ccode>@WebMvcTest\u003C\u002Fcode> 已经不在 \u003Ccode>spring-boot-test-autoconfigure\u003C\u002Fcode> 里了，新包名是 \u003Ccode>org.springframework.boot.webmvc.test.autoconfigure\u003C\u002Fcode>，依赖也要换成 \u003Ccode>spring-boot-starter-webmvc-test\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Ch2>三、parent 坐标别写错\u003C\u002Fh2>\n\u003Cp>这条最坑：Spring Initializr 会给你生成 \u003Ccode>4.1.1.RELEASE\u003C\u002Fcode>，\u003Cstrong>这个坐标在 Maven Central 上是 404\u003C\u002Fstrong>。 Boot 从 2.4 起就不带 \u003Ccode>.RELEASE\u003C\u002Fcode> 后缀了。\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>写法\u003C\u002Fth>\n   \u003Cth>结果\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>4.1.1.RELEASE\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>❌ 404\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>4.1.1\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>✅ 正确\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cblockquote>\n \u003Cp>教训：任何\"工具生成的东西\"都要自己验证一遍，尤其是版本号这种看起来最不可能出错的地方。\u003C\u002Fp>\n\u003C\u002Fblockquote>","145","2026-08-29 20:56:11","2026-10-18 23:25:29",[15,18],{"id":4,"name":16,"slug":17},"技术","tech",{"id":19,"name":20,"slug":21},"4","Spring Boot","spring-boot",{"id":23,"title":24,"slug":25},"2","为什么我把博客改成了 SSG，以及百度收录从 3% 到全量","ssg-blog-setup","\u003Cp>从 Boot 3 升到 4 不是改个版本号就完事。我实际踩到的三个坑，按\"会让你编译不过\"的程度排序。\u003C\u002Fp>\n\u003Ch2>一、\u003Ccode>and()\u003C\u002Fcode> 被移除\u003C\u002Fh2>\n\u003Cp>Spring Security 7 把链式调用的 \u003Ccode>and()\u003C\u002Fcode> 从整个 builder 层级删掉了，旧写法直接编译失败：\u003C\u002Fp>\n\u003Cpre class=\"shiki rose-pine-dawn\" style=\"background-color:#faf4ed;color:#575279\" tabindex=\"0\" data-lang=\"java\">\u003Ccode>\u003Cspan class=\"line\" data-line=\"1\">\u003Cspan style=\"color:#797593;font-style:italic\">\u002F\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#9893A5;font-style:italic\"> ❌ 编译不过\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" data-line=\"2\">\u003Cspan style=\"color:#575279;font-style:italic\">http\u003C\u002Fspan>\u003Cspan style=\"color:#797593\">.\u003C\u002Fspan>\u003Cspan style=\"color:#D7827E\">csrf\u003C\u002Fspan>\u003Cspan style=\"color:#797593\">().\u003C\u002Fspan>\u003Cspan style=\"color:#D7827E\">disable\u003C\u002Fspan>\u003Cspan style=\"color:#797593\">().\u003C\u002Fspan>\u003Cspan style=\"color:#D7827E\">authorizeRequests\u003C\u002Fspan>\u003Cspan style=\"color:#797593\">()...\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" data-line=\"3\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" data-line=\"4\">\u003Cspan style=\"color:#797593;font-style:italic\">\u002F\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#9893A5;font-style:italic\"> ✅ 只能 lambda DSL\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" data-line=\"5\">\u003Cspan style=\"color:#575279;font-style:italic\">http\u003C\u002Fspan>\u003Cspan style=\"color:#797593\">.\u003C\u002Fspan>\u003Cspan style=\"color:#D7827E\">csrf\u003C\u002Fspan>\u003Cspan style=\"color:#797593\">(\u003C\u002Fspan>\u003Cspan style=\"color:#575279\">csrf \u003C\u002Fspan>\u003Cspan style=\"color:#286983\">->\u003C\u002Fspan>\u003Cspan style=\"color:#575279;font-style:italic\"> csrf\u003C\u002Fspan>\u003Cspan style=\"color:#797593\">.\u003C\u002Fspan>\u003Cspan style=\"color:#D7827E\">disable\u003C\u002Fspan>\u003Cspan style=\"color:#797593\">())\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" data-line=\"6\">\u003Cspan style=\"color:#797593\">    .\u003C\u002Fspan>\u003Cspan style=\"color:#D7827E\">authorizeHttpRequests\u003C\u002Fspan>\u003Cspan style=\"color:#797593\">(\u003C\u002Fspan>\u003Cspan style=\"color:#575279\">auth \u003C\u002Fspan>\u003Cspan style=\"color:#286983\">->\u003C\u002Fspan>\u003Cspan style=\"color:#575279;font-style:italic\"> auth\u003C\u002Fspan>\u003Cspan style=\"color:#797593\">.\u003C\u002Fspan>\u003Cspan style=\"color:#D7827E\">anyRequest\u003C\u002Fspan>\u003Cspan style=\"color:#797593\">().\u003C\u002Fspan>\u003Cspan style=\"color:#D7827E\">authenticated\u003C\u002Fspan>\u003Cspan style=\"color:#797593\">());\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>二、测试 starter 被拆开\u003C\u002Fh2>\n\u003Cp>\u003Ccode>@WebMvcTest\u003C\u002Fcode> 已经不在 \u003Ccode>spring-boot-test-autoconfigure\u003C\u002Fcode> 里了，新包名是 \u003Ccode>org.springframework.boot.webmvc.test.autoconfigure\u003C\u002Fcode>，依赖也要换成 \u003Ccode>spring-boot-starter-webmvc-test\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Ch2>三、parent 坐标别写错\u003C\u002Fh2>\n\u003Cp>这条最坑：Spring Initializr 会给你生成 \u003Ccode>4.1.1.RELEASE\u003C\u002Fcode>，\u003Cstrong>这个坐标在 Maven Central 上是 404\u003C\u002Fstrong>。 Boot 从 2.4 起就不带 \u003Ccode>.RELEASE\u003C\u002Fcode> 后缀了。\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>写法\u003C\u002Fth>\n   \u003Cth>结果\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>4.1.1.RELEASE\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>❌ 404\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>4.1.1\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>✅ 正确\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cblockquote>\n \u003Cp>教训：任何\"工具生成的东西\"都要自己验证一遍，尤其是版本号这种看起来最不可能出错的地方。\u003C\u002Fp>\n\u003C\u002Fblockquote>",1792348093749]