# 路由冲突问题修复说明 ## 🔴 问题原因 **错误信息**: ``` Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: "bestsellers" ``` **根本原因**: Spring MVC 的路由匹配顺序问题。`@GetMapping("/{id}")` 路由定义在 `/bestsellers` 和 `/today-recommend` 之前,导致: - 请求 `/api/book/bestsellers` 时,Spring 先匹配到 `/{id}` 路由 - Spring 尝试将 "bestsellers" 作为路径变量 `{id}` 解析为 `Integer` - 导致 `NumberFormatException` 错误 ## ✅ 已修复 ### 修复内容 1. ✅ 将 `/today-recommend` 路由移到 `/{id}` 路由之前 2. ✅ 将 `/bestsellers` 路由移到 `/{id}` 路由之前 3. ✅ 添加了注释说明路由顺序的重要性 ### 修复后的路由顺序 ```java @GetMapping("/list") // 1. 具体路径 @GetMapping("/today-recommend") // 2. 具体路径(新增,必须在 /{id} 之前) @GetMapping("/bestsellers") // 3. 具体路径(新增,必须在 /{id} 之前) @GetMapping("/{id}") // 4. 路径变量(必须在所有具体路径之后) ``` ## 🔧 修复步骤 ### 步骤1:重启后端服务 ⭐ 必须执行 **重要**:修改了后端代码后,必须重启后端服务才能生效。 ```bash # 停止当前运行的后端服务(Ctrl+C) # 重新启动后端服务 cd book mvn spring-boot:run ``` 或者如果你使用的是IDE(如IntelliJ IDEA),直接重启Spring Boot应用。 ### 步骤2:验证路由修复 #### 方法1:浏览器测试 在浏览器中访问以下URL,应该能正常返回JSON数据: ``` http://localhost:8081/api/book/today-recommend?limit=8 http://localhost:8081/api/book/bestsellers?limit=10 ``` **期望返回**: ```json { "code": 200, "message": "操作成功", "data": [ { "id": 1, "title": "西游记", "author": "(明) 吴承恩", ... } ] } ``` #### 方法2:使用curl测试 ```bash # 测试今日推荐 curl http://localhost:8081/api/book/today-recommend?limit=8 # 测试畅销书籍 curl http://localhost:8081/api/book/bestsellers?limit=10 ``` ### 步骤3:检查数据库是否有数据 如果API返回空数组 `{"code": 200, "data": []}`,说明数据库中没有数据。 **检查数据**: ```sql USE books_db; -- 检查上架的书籍数量 SELECT COUNT(*) as total FROM books WHERE status = 1; -- 如果数量为0,需要执行SQL脚本插入数据 ``` **插入数据**: 执行 `book/src/main/resources/db/quick_insert_books.sql` 文件,或者在Navicat中执行以下SQL: ```sql USE books_db; -- 插入今日推荐书籍(8本) INSERT INTO `books` (`title`, `author`, `cover`, `image`, `brief`, `desc`, `introduction`, `price`, `is_free`, `is_vip`, `category_id`, `status`, `view_count`, `like_count`, `read_count`, `created_at`, `updated_at`) VALUES ('西游记', '(明) 吴承恩', 'https://picsum.photos/seed/xiyouji/200/300', 'https://picsum.photos/seed/xiyouji/200/300', '《西游记》是中国古代第一部神魔题材的长篇章回小说', '中国古代第一部浪漫主义章回体长篇神魔小说', '本书《西游记》是中国古代第一部浪漫主义章回体长篇神魔小说', 0.00, 1, 0, 1, 1, 850, 120, 450, NOW(), NOW()), ('传习录:全译全注', '王阳明', 'https://picsum.photos/seed/chuanxilu/200/300', 'https://picsum.photos/seed/chuanxilu/200/300', '王阳明心学的核心著作', '王阳明心学的核心著作', '传习录是王阳明心学的核心著作', 0.00, 1, 0, 1, 1, 620, 89, 320, NOW(), NOW()), ('社会契约论', '让·雅克·卢梭', 'https://picsum.photos/seed/shehuiqiyue/200/300', 'https://picsum.photos/seed/shehuiqiyue/200/300', '探讨了政治权力的合法性和人民主权的基本原则', '探讨了政治权力的合法性和人民主权的基本原则', '社会契约论是让·雅克·卢梭的重要政治哲学著作', 0.00, 1, 0, 1, 1, 480, 67, 280, NOW(), NOW()), ('没有烦恼的世界', '一行禅师', 'https://picsum.photos/seed/meiyoufan-nao/200/300', 'https://picsum.photos/seed/meiyoufan-nao/200/300', '一行禅师的心灵成长著作', '一行禅师的心灵成长著作', '《没有烦恼的世界》是一行禅师的心灵成长著作', 0.00, 1, 0, 1, 1, 390, 56, 210, NOW(), NOW()), ('透过电影看文化', '张艺谋', 'https://picsum.photos/seed/dianyingwenhua/200/300', 'https://picsum.photos/seed/dianyingwenhua/200/300', '通过电影作品探讨文化内涵', '通过电影作品探讨文化内涵', '《透过电影看文化》通过分析经典电影作品', 0.00, 1, 0, 1, 1, 320, 45, 180, NOW(), NOW()), ('车尔尼钢琴流畅练习曲', '卡尔·车尔尼', 'https://picsum.photos/seed/cheerni/200/300', 'https://picsum.photos/seed/cheerni/200/300', '钢琴练习经典教材', '钢琴练习经典教材', '《车尔尼钢琴流畅练习曲》是钢琴练习的经典教材', 0.00, 1, 0, 1, 1, 280, 38, 150, NOW(), NOW()), ('走向大洋', '余秋雨', 'https://picsum.photos/seed/zouxiangdayang/200/300', 'https://picsum.photos/seed/zouxiangdayang/200/300', '余秋雨的旅行散文集', '余秋雨的旅行散文集', '《走向大洋》是余秋雨的旅行散文集', 0.00, 1, 0, 1, 1, 250, 34, 130, NOW(), NOW()), ('思维的艺术', '丹尼尔·卡尼曼', 'https://picsum.photos/seed/siweideyishu/200/300', 'https://picsum.photos/seed/siweideyishu/200/300', '探讨人类思维方式和决策过程', '探讨人类思维方式和决策过程', '《思维的艺术》是丹尼尔·卡尼曼的经典著作', 0.00, 1, 0, 1, 1, 220, 30, 110, NOW(), NOW()); -- 插入畅销书籍(10本,阅读量较高) INSERT INTO `books` (`title`, `author`, `cover`, `image`, `brief`, `desc`, `introduction`, `price`, `is_free`, `is_vip`, `category_id`, `status`, `view_count`, `like_count`, `read_count`, `created_at`, `updated_at`) VALUES ('互联网心理学', '雷雳', 'https://picsum.photos/seed/hulianwangxinlixue/200/300', 'https://picsum.photos/seed/hulianwangxinlixue/200/300', '当连接万物的互联网遇见无处不在的心理学', '当连接万物的互联网遇见无处不在的心理学', '《互联网心理学》探讨了互联网时代人们的心理变化', 0.00, 1, 0, 1, 1, 5680, 890, 3450, DATE_SUB(NOW(), INTERVAL 30 DAY), NOW()), ('孝经 (中华经典诵读)', '孔子', 'https://picsum.photos/seed/xiaojing/200/300', 'https://picsum.photos/seed/xiaojing/200/300', '以孔子与其弟子曾参之间问答的形式', '以孔子与其弟子曾参之间问答的形式', '《孝经》是中国古代重要的儒家经典', 0.00, 1, 0, 1, 1, 4920, 756, 2980, DATE_SUB(NOW(), INTERVAL 25 DAY), NOW()), ('自省', '约翰·班扬', 'https://picsum.photos/seed/zixing/200/300', 'https://picsum.photos/seed/zixing/200/300', '讲述了敬虔之人和不敬虔之人截然相反的结局', '讲述了敬虔之人和不敬虔之人截然相反的结局', '《自省》是约翰·班扬的经典作品', 0.00, 1, 0, 1, 1, 4250, 634, 2670, DATE_SUB(NOW(), INTERVAL 20 DAY), NOW()), ('三体', '刘慈欣', 'https://picsum.photos/seed/santi/200/300', 'https://picsum.photos/seed/santi/200/300', '科幻小说,讲述了地球文明与三体文明', '科幻小说,讲述了地球文明与三体文明', '《三体》是刘慈欣创作的科幻小说', 29.90, 0, 0, 3, 1, 3680, 567, 2340, DATE_SUB(NOW(), INTERVAL 35 DAY), NOW()), ('理想国', '柏拉图', 'https://picsum.photos/seed/lixiangguo/200/300', 'https://picsum.photos/seed/lixiangguo/200/300', '古希腊哲学家柏拉图的经典著作', '古希腊哲学家柏拉图的经典著作', '《理想国》是古希腊哲学家柏拉图的经典著作', 0.00, 1, 1, 4, 1, 3120, 489, 1980, DATE_SUB(NOW(), INTERVAL 40 DAY), NOW()), ('红楼梦', '曹雪芹', 'https://picsum.photos/seed/hongloumeng/200/300', 'https://picsum.photos/seed/hongloumeng/200/300', '中国古典四大名著之一', '中国古典四大名著之一', '《红楼梦》是清代作家曹雪芹创作的长篇小说', 0.00, 1, 0, 1, 1, 2890, 456, 1780, DATE_SUB(NOW(), INTERVAL 45 DAY), NOW()), ('百年孤独', '加西亚·马尔克斯', 'https://picsum.photos/seed/bainiangudu/200/300', 'https://picsum.photos/seed/bainiangudu/200/300', '魔幻现实主义文学的代表作', '魔幻现实主义文学的代表作', '《百年孤独》是加西亚·马尔克斯的经典作品', 39.90, 0, 0, 1, 1, 2670, 423, 1650, DATE_SUB(NOW(), INTERVAL 50 DAY), NOW()), ('人类简史', '尤瓦尔·赫拉利', 'https://picsum.photos/seed/renleijianshi/200/300', 'https://picsum.photos/seed/renleijianshi/200/300', '从认知革命到科学革命', '从认知革命到科学革命', '《人类简史》是尤瓦尔·赫拉利的畅销作品', 49.90, 0, 0, 1, 1, 2450, 398, 1520, DATE_SUB(NOW(), INTERVAL 55 DAY), NOW()), ('活着', '余华', 'https://picsum.photos/seed/huozhe/200/300', 'https://picsum.photos/seed/huozhe/200/300', '余华的代表作', '余华的代表作', '《活着》是余华的代表作', 0.00, 1, 0, 1, 1, 2230, 367, 1390, DATE_SUB(NOW(), INTERVAL 60 DAY), NOW()), ('围城', '钱钟书', 'https://picsum.photos/seed/weicheng/200/300', 'https://picsum.photos/seed/weicheng/200/300', '中国现代文学的经典之作', '中国现代文学的经典之作', '《围城》是钱钟书的经典作品', 0.00, 1, 0, 1, 1, 2010, 334, 1250, DATE_SUB(NOW(), INTERVAL 65 DAY), NOW()); ``` ### 步骤4:刷新前端页面 在微信开发者工具中: 1. 刷新首页 2. 查看控制台日志(应该没有错误) 3. 查看Network面板(请求应该成功) 4. 页面应该显示书籍列表 ## ✅ 验证清单 修复后,请确认: - [ ] 后端服务已重启(修改代码后必须重启) - [ ] API接口可以访问(浏览器测试通过,不再报错) - [ ] 数据库中有书籍数据(至少18本,status=1) - [ ] 网络请求成功(Network面板显示200,不再有NumberFormatException错误) - [ ] 控制台没有错误日志 - [ ] 前端页面显示书籍列表 ## 🎯 预期结果 修复成功后: 1. **API测试**: - `http://localhost:8081/api/book/today-recommend?limit=8` 返回书籍列表 ✅ - `http://localhost:8081/api/book/bestsellers?limit=10` 返回书籍列表 ✅ - 不再有 `NumberFormatException` 错误 ✅ 2. **前端页面**: - "今日推荐"显示8本书 ✅ - "畅销书籍"显示10本书 ✅ - 不再显示错误提示 ✅ 3. **控制台日志**: - 没有错误信息 ✅ - 显示"数据加载成功,共X本" ✅ ## 📌 重要提示 1. **必须重启后端服务**:修改了后端代码后,必须重启后端服务才能生效 2. **路由顺序很重要**:具体的路径路由必须放在路径变量路由之前 3. **数据库必须有数据**:如果API返回空数组,需要执行SQL脚本插入数据 4. **查看控制台日志**:如果还有问题,查看控制台日志了解具体错误 ## 🔍 如果问题仍然存在 如果修复后仍然有问题,请检查: 1. **后端服务是否已重启**:修改代码后必须重启 2. **数据库是否有数据**:执行SQL查询检查 3. **API接口是否正常**:在浏览器中测试API 4. **前端API配置是否正确**:检查 `books/utils/config.js` 5. **查看控制台日志**:了解具体的错误信息 --- **创建时间**:2024年 **最后更新**:2024年