You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:48:13