Spring Boot项目出现Status 404 Not Found错误,两日未解决寻求技术帮助
我帮你仔细梳理了代码,发现几个关键问题导致了404错误,咱们一个个来解决:
1. 组件扫描范围错误(核心原因)
你的RegplustextApplication类手动指定了@ComponentScan("com.training.regplustext.repository"),这会让Spring只扫描repository包下的组件,而Controller、Service这些核心组件所在的controller、service包完全没被加载到Spring容器里。没有注册任何Controller,自然所有请求都会返回404。
解决方案:
直接删除@ComponentScan注解就行,因为@SpringBootApplication默认会扫描主类所在包(com.training.regplustext)及其所有子包,你的controller、service、repository都在这个范围内,不需要额外指定扫描路径:
package com.training.regplustext; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class RegplustextApplication { public static void main(String[] args) { SpringApplication.run(RegplustextApplication.class, args); } }
2. Login接口的路径参数不匹配
你的UserRestController里的loginPage方法用了@PathVariable Long id,但对应的@PostMapping("login-page/")路径里没有{id}占位符,Spring根本匹配不到这个请求方法,这也是引发404的重要原因。另外看业务逻辑,login方法其实不需要id参数——它是通过用户名和密码做验证的。
解决方案:
如果id参数是多余的,直接删掉就行;如果确实需要传递id,可以改成@RequestParam或者调整路径占位符:
方案一(删除多余id参数):
@PostMapping("login-page/") public ResponseEntity<String> loginPage(@RequestBody UserRegistrationEntity user){ try{ UserRegistrationEntity loggedUser = userService.login(user.getUsername(), user.getPassword()); return ResponseEntity.ok(loggedUser.getId() + " id login has passed successfully!"); }catch (AccountNotFound ex){ return ResponseEntity.badRequest().body(ex.getMessage()); } }
方案二(保留id参数,用@RequestParam传递):
@PostMapping("login-page/") public ResponseEntity<String> loginPage(@RequestBody UserRegistrationEntity user, @RequestParam Long id){ try{ userService.login(user.getUsername(), user.getPassword()); return ResponseEntity.ok(id + " id login has passed successfully!"); }catch (AccountNotFound ex){ return ResponseEntity.badRequest().body(ex.getMessage()); } }
3. 注册接口的返回值小缺陷(非404,但需修复)
注册接口里的返回字符串"{id} id registration has passed successfully!"中的{id}不会自动替换成实际的id值,需要手动拼接或者用字符串格式化:
@PostMapping("registration-page/") public ResponseEntity<String> regPage(@RequestBody UserRegistrationEntity newUser, @RequestParam Long id) { try{ UserRegistrationEntity savedUser = userService.registration(newUser.getUsername(), newUser.getPassword()); return ResponseEntity.ok(savedUser.getId() + " id registration has passed successfully!"); }catch (NullRegistrationException ex){ return ResponseEntity.badRequest().body(ex.getMessage()); } }
最后验证请求路径
确保Postman的请求路径和Controller配置完全一致:
- 注册接口:POST
http://localhost:8081/welcome-page/registration-page/?id=xxx(如果保留id参数) - 登录接口:POST
http://localhost:8081/welcome-page/login-page/,请求体携带username和password字段
按照上面的步骤修改后,应该就能解决404问题了。
内容的提问来源于stack exchange,提问作者user16624394

