Spring Boot登录注册应用Postman POST请求报404错误求助
Spring Boot注册接口POST请求404问题排查
我基于Spring Boot开发了一套用户登录与注册应用,项目启动运行无报错,但在Postman中发送POST请求时出现「404 Not Found」错误,请求帮忙排查原因。
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>net.guides.springboot3</groupId> <artifactId>Backend</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Backend</name> <description>Spring Boot Backend</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>19</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-crypto</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
RegistrationController.java
package net.guides.springboot3.Backend.controller; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestParam; //import net.guides.springboot3.Backend.exception.ResourceNotFoundException; import net.guides.springboot3.Backend.model.User; import net.guides.springboot3.Backend.repository.UserRepository; import net.guides.springboot3.Backend.service.UserService; @RestController @RequestMapping("/api") public class RegistrationController { private UserService userService; public RegistrationController(UserService userService) { this.userService = userService; } @PostMapping("/register") public ResponseEntity<Object> registerUser(@Valid @RequestBody User user) { boolean isRegistered = userService.registerUser(user); if (!isRegistered) { return new ResponseEntity<>("Email already in use", HttpStatus.BAD_REQUEST); } return new ResponseEntity<>("User registered successfully. Verify your email before login", HttpStatus.OK); } //verifyEmail endpoint method @GetMapping("/verify-email") public ResponseEntity<Object> verifyEmail(@RequestParam("token") String token) { boolean isVerified = userService.verifyEmail(token); if (!isVerified) { return new ResponseEntity<>("Invalid token", HttpStatus.BAD_REQUEST); } return new ResponseEntity<>("Email verified successfully", HttpStatus.OK); } }
UserRepository.java
package net.guides.springboot3.Backend.repository; import net.guides.springboot3.Backend.model.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface UserRepository extends JpaRepository<User, Long> { boolean existsByEmail(String email); User findByVerificationToken(String token); }
User.java
package net.guides.springboot3.Backend.model; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; import jakarta.persistence.GeneratedValue; @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "email", unique = true, nullable = false) private String email; @Column(name = "password", nullable = false) private String password; private String verificationToken; // other fields // getters and setters public String getVerificationToken() { return verificationToken; } // getters and setters public void setPassword(String password) { this.password = password; } public String getPassword() { return password; } @Column(name = "verification_token") public void setVerificationToken(String verificationToken) { this.verificationToken = verificationToken; } @Column(name = "first_name", nullable = false) private String firstName; @Column(name = "last_name", nullable = false) private String lastName; @Column(name = "is_verified", nullable = false) private boolean isVerified; // getters and setters public void setIsVerified(boolean isVerified) { this.isVerified = isVerified; } public boolean getIsVerified() { return isVerified; } // getters and setters public String getEmail() { return email; } }
UserService.java
package net.guides.springboot3.Backend.service; import java.util.UUID; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import net.guides.springboot3.Backend.model.User; import net.guides.springboot3.Backend.repository.UserRepository; import net.guides.springboot3.Backend.model.User; import net.guides.springboot3.Backend.repository.UserRepository; @Service public class UserService { private BCryptPasswordEncoder passwordEncoder; private UserRepository userRepository; private JavaMailSender javaMailSender; public UserService(UserRepository userRepository, JavaMailSender javaMailSender) { this.userRepository = userRepository; this.javaMailSender = javaMailSender; this.passwordEncoder = new BCryptPasswordEncoder(); } public boolean registerUser(User user) { if (userRepository.existsByEmail(user.getEmail())) { return false; } //Encrypt password using bcrypt user.setPassword(passwordEncoder.encode(user.getPassword())); user.setVerificationToken(UUID.randomUUID().toString()); user.setIsVerified(false); userRepository.save(user); // send verification email SimpleMailMessage mailMessage = new SimpleMailMessage(); mailMessage.setTo(user.getEmail()); mailMessage.setSubject("Verify your email address"); mailMessage.setText("Please click the link below to verify your email address: \n" + "http://localhost:8080/verify-email?token=" + user.getVerificationToken()); javaMailSender.send(mailMessage); return true; } public boolean verifyEmail(String token) { User user = userRepository.findByVerificationToken(token); if (user == null) { return false; } user.setIsVerified(true); user.setVerificationToken(null); userRepository.save(user); return true; } }
排查方向
- 请求路径错误:注册接口的完整路径是
POST http://localhost:8080/api/register,检查Postman中是否正确填写了该路径,不要遗漏/api前缀。另外,UserService中发送的验证链接路径缺失/api,应该改为http://localhost:8080/api/verify-email?token=xxx,否则验证请求也会返回404。 - 启动类包扫描范围:确认Spring Boot启动类所在包是否为
net.guides.springboot3.Backend或其父包,只有这样才能自动扫描到controller层的Bean。如果启动类在其他包下,需要在启动类上添加@ComponentScan(basePackages = "net.guides.springboot3.Backend")指定扫描范围。 - 依赖冲突问题:Spring Boot 3采用Jakarta EE规范,而你同时引入了
javax.validation(旧版JEE规范)和spring-boot-starter-validation(Jakarta版本),还有重复的jakarta.persistence-api依赖,这会导致依赖冲突,影响Spring MVC的正常初始化。建议删除javax.validation:validation-api和jakarta.persistence:jakarta.persistence-api这两个依赖,Spring Boot的starter已经包含了所需的依赖。 - 实体类映射问题:User类中
verificationToken字段的@Column注解加在了setter方法上,其他字段的注解都在字段上,这种混合使用可能导致JPA映射异常,间接影响应用Bean的初始化。建议统一将@Column(name = "verification_token")移到private String verificationToken;字段上方。 - 请求方式与Content-Type:确认Postman中使用的是POST请求,并且请求头的
Content-Type设置为application/json,否则Spring无法正确解析请求体,也可能导致404或其他错误。
内容的提问来源于stack exchange,提问作者Kushagra
相关产品推荐
相关产品推荐

