如何在Spring Boot中实现客户端提供唯一ID的POST请求?

问题描述 投票:0回答:1

我正在开发一个 Spring Boot 应用程序,我需要实现一个 POST 请求来创建一个新的 Book 对象。图书的唯一标识符 (nombreLibro) 由客户端提供,并且在数据库中需要是唯一的。

这是我的 Book 实体和控制器中的 createBook 方法的代码:

@Table("t_catalogo")
public class Book {
    @Id
    @Column("nombreLibro")
    private String nombreLibro;

    // other fields, constructors, getters and setters
}

@PostMapping("/{nombreLibro}")
public ResponseEntity<Void> createBook(@PathVariable String nombreLibro, @RequestBody Book newBook) {
    Book savedBook = newBook;
    savedBook.setNombreLibro(nombreLibro);
    try {
        bookRepository.save(savedBook);
            return ResponseEntity.status(HttpStatus.CREATED).body(newBook);

    } catch (DataIntegrityViolationException e) {
        return ResponseEntity
            .status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body("An error occurred while trying to save the book.");
    }
}

当我尝试使用数据库中不存在的 nombreLibro 创建书籍时,我收到 500 内部服务器错误。我相信这是因为 Spring 正在尝试更新现有的书籍而不是创建新的书籍。

当数据库中不存在 nombreLibro 时,如何修改 createBook 方法来创建新书?

spring spring-boot spring-mvc spring-data-jpa spring-data
1个回答
0
投票

当您使用 Spring Data JPA 时,它会检查主键值(带有 @Id 注释的字段的值)来决定是否应该更新或插入。

如果存在值,则表示更新。如果不存在值,则为插入。

由于在您的情况下

nombreLibro
是一个功能字段而不是主要字段,您可以创建一个新的
id
字段,该字段将为您的
nombreLibro
存储唯一的 UUID 和常规字段。

更新时,您可以获得

id
nombreLibro
值并使用它。

@Table("t_catalogo")
public class Book {
    @Id
    @Column("id")
    private String id = UUID.randomUUID().toString();

    @Column("nombreLibro")
    private String nombreLibro;

    // other fields, constructors, getters and setters
}
© www.soinside.com 2019 - 2024. All rights reserved.