spring 如何在Sping Boot 中实现POST请求,其中客户端提供唯一ID?

tgabmvqs  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(52)

我正在处理一个Sping Boot 应用程序,我需要实现一个POST请求来创建一个新的Book对象。Book的唯一标识符(nombreLibro)由客户端提供,它需要在数据库中是唯一的。
下面是我的Book实体和控制器中的Notebook方法的代码:

@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创建一个Book时,我得到一个500内部服务器错误。我相信这是因为Spring试图更新现有的Book,而不是创建一个新的。
当数据库中不存在命名Libro时,我如何修改我的Book方法来创建一个新的Book?

q43xntqr

q43xntqr1#

当您使用Spring Data JPA时,它会检查是否有primary key value(带有@Id annotation的字段的值)来决定是否应该更新或插入。
如果存在值,则为更新。如果不存在值,则为插入。
由于在您的情况下nombreLibro是一个功能字段而不是主字段,因此您可以创建一个新的id字段,该字段将为您的nombreLibro存储Unique UUID和常规字段。
更新时,您可以获取nombreLibroid值并使用它。

@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
}

字符串

相关问题