Spring Boot не может создать новую строку в таблицеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring Boot не может создать новую строку в таблице

Сообщение Anonymous »

Я использую Spring Boot в качестве простого бэкэнда для своей веб-страницы. Я использую Spring Security и OAuth2 для аутентификации (входа) пользователей на своей странице. Когда пользователь входит на мою страницу, я хочу сохранить некоторую базовую информацию о пользователе в своем бэкэнде, а именно имя, адрес электронной почты и идентификатор (сгенерированный профилем OAuth). Моя проблема в том, что когда я реализую это (см. ниже), метод user.save всегда выдает ошибку, сообщающую, что данный пользователь отсутствует.
Конкретная ошибка:< /p>

Код: Выделить всё

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
Я чувствую, что это ошибка, потому что я пытаюсь создать нового пользователя в БД с предоставленной информацией - поэтому, конечно, он не должен ее искать, а пользователь уже не должен быть там. Я хочу, чтобы он ВСТАВЛЯЛ, а не ОБНОВЛЯЛ. Ключевым моментом здесь является то, что мой идентификатор НЕ генерируется автоматически. Я хочу использовать идентификаторы поставщиков OAuth для каждого потенциального поставщика (например, Google, как показано ниже).
Некоторые особенности:
  • У меня есть таблица пользователей (серверная часть Postgres 16), определенная следующим образом:

Код: Выделить всё

@Table(name = "users")
public record User (
@Id
String id,
String externalid,
String externalidprovider,
String name,
@NotNull @Email
String email
) {}
  • Контроллер:

Код: Выделить всё

@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 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);
}
}
  • Репозиторий — это просто расширенный репозиторий CrudRepository:

Код: Выделить всё

public interface UserRepository extends CrudRepository {}
На стороне БД, если это имеет значение, моя инициализация пользователей:

Код: Выделить всё

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()
);
Я могу и даже написал метод создания вручную в репозитории, который, кажется, работает. Однако мне неприятно, что я не могу заставить работать базовый оператор INSERT. Есть идеи, что здесь происходит – я что-то неправильно настроил?

Подробнее здесь: https://stackoverflow.com/questions/793 ... w-in-table
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»