Spring Boot自定义ID插入User报错:无法创建新行
Spring Boot集成OAuth2时,调用
user.save()报错:指定User不存在 我用Spring Boot搭建网页后端,集成Spring Security和OAuth2实现用户登录认证,登录时希望在后端存储用户基本信息(姓名、邮箱及OAuth生成的ID)。但调用user.save()方法时总是抛出错误,提示指定User不存在。
具体错误信息
org.springframework.dao.IncorrectUpdateSemanticsDataAccessException: Failed to update entity [User[id=google-1234, externalid=1234, externalidprovider=google, name=John Doe, email=john.doe@gmail]]; Id [google-1234] not found in database
我判断问题在于:明明要创建新用户,系统却尝试执行更新操作。我的id并非自动生成,而是用OAuth提供商的ID拼接而成(示例中的google-1234)。
相关代码细节
1. User实体定义(数据库为Postgres 16)
@Table(name = "users") public record User ( @Id String id, String externalid, String externalidprovider, String name, @NotNull @Email String email ) {}
2. Controller代码
@RestController @RequestMapping("/users") public class UserController { private final UserRepository userRepository; public UserController(UserRepository userRepository) { this.userRepository = userRepository; } @ResponseStatus(HttpStatus.CREATED) @PostMapping("/upsert-google") User upsertGoogleUser(@AuthenticationPrincipal OAuth2User googlePrincipal) { logger.info("Upserting google user: {}", googlePrincipal); // Check if the user already exists if (googlePrincipal == null) { logger.error("Null OAuth2User principal provided"); throw new IllegalArgumentException("Invalid Google user information"); } String userId = "google-" + googlePrincipal.getAttribute("sub"); logger.info("Upserting Google user with ID: {}", userId); // Check if the user already exists Optional<User> existingUserOpt = userRepository.findById(userId); if (existingUserOpt.isPresent()) { User existingUser = existingUserOpt.get(); logger.info("Found existing user: {}", existingUser); return updatedUser; } else { User newUser = new User( userId, googlePrincipal.getAttribute("sub"), "google", googlePrincipal.getAttribute("name"), googlePrincipal.getAttribute("email") ); logger.info("Creating new Google user: {}", newUser); return userRepository.save(newUser); } } }
3. Repository代码
public interface UserRepository extends CrudRepository<User,String> {}
数据库初始化语句
DROP TABLE IF EXISTS Users CASCADE; CREATE TABLE IF NOT EXISTS Users ( id TEXT PRIMARY KEY, externalid TEXT, externalidprovider TEXT, name TEXT NOT NULL, email TEXT NOT NULL, membersince TIMESTAMP NOT NULL DEFAULT NOW(), lastlogin TIMESTAMP NOT NULL DEFAULT NOW() );
目前我已手动编写了create方法并可正常使用,但无法使用Spring Data的基础INSERT操作,想确认是否存在配置错误。
内容的提问来源于stack exchange,提问作者Paco
相关产品推荐
相关产品推荐

