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

tgabmvqs  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(110)

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

  1. @Table("t_catalogo")
  2. public class Book {
  3. @Id
  4. @Column("nombreLibro")
  5. private String nombreLibro;
  6. // other fields, constructors, getters and setters
  7. }
  8. @PostMapping("/{nombreLibro}")
  9. public ResponseEntity<Void> createBook(@PathVariable String nombreLibro, @RequestBody Book newBook) {
  10. Book savedBook = newBook;
  11. savedBook.setNombreLibro(nombreLibro);
  12. try {
  13. bookRepository.save(savedBook);
  14. return ResponseEntity.status(HttpStatus.CREATED).body(newBook);
  15. } catch (DataIntegrityViolationException e) {
  16. return ResponseEntity
  17. .status(HttpStatus.INTERNAL_SERVER_ERROR)
  18. .body("An error occurred while trying to save the book.");
  19. }
  20. }

字符串
当我尝试使用数据库中不存在的nombreLibro创建一个Book时,我得到一个500内部服务器错误。我相信这是因为Spring试图更新现有的Book,而不是创建一个新的。
当数据库中不存在命名Libro时,我如何修改我的Book方法来创建一个新的Book?

q43xntqr

q43xntqr1#

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

  1. @Table("t_catalogo")
  2. public class Book {
  3. @Id
  4. @Column("id")
  5. private String id = UUID.randomUUID().toString();
  6. @Column("nombreLibro")
  7. private String nombreLibro;
  8. // other fields, constructors, getters and setters
  9. }

字符串

展开查看全部

相关问题