【问题标题】:What object should I POST in Spring Boot REST API?我应该在 Spring Boot REST API 中发布什么对象?
【发布时间】:2021-02-10 05:34:50
【问题描述】:

我有一个带有 id、name 和 surname 的 Hibernate 模型。我正在使用它从数据库中获取数据,然后在 GET 端点是这个:

@GetMapping(value = "/contacts", produces = MediaType.APPLICATION_JSON_VALUE)
public List<Contact> allContacts() {
    return contactService.findAll();
}

如您所见,它返回Contact 对象。实际上它是一个 Hibernate 实体。

问题是当我使用这段代码时

@PostMapping("/contacts")
public Contact createContact(Contact contact) {
    return contactService.createContact(contact);
}

它不仅询问namesurname,还询问id。 POST 方法不应要求id,因为它们尚未创建。我应该怎么做才能让它不要求id

编辑:这是 Contact.java 类

import lombok.Data;
import javax.persistence.*;

@Entity
@Data
public class Contact {

    public Contact() {
    }

    public Contact(Integer id, String name, String surname) {
        this.id = id;
        this.name = name;
        this.surname = surname;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(columnDefinition = "serial")
    private Integer id;

    private String name;

    private String surname;

}

【问题讨论】:

  • 您应该使用 DTO 并将实体仅保留在持久层中以实现干净的架构。之后,您将不再面临此问题。
  • 联系人如何映射到您的表格?你有一个@GeneratedValue 来为它分配一个序列或类似的 id 吗?你能显示联系人的来源吗?
  • @Lkopo 这不是真的,它非常取决于场景。实体可以很好地用作发送和接收的数据模型,这并没有错。 Here我更详细地解释了这一点。
  • @ilhan 你能检查一下@Entity class Contact{..}id,它用于ID 生成的策略是什么?或者,请告诉我们Contact 类。

标签: java spring-boot hibernate rest spring-data-jpa


【解决方案1】:

定义一个ContactInput 类,该类只包含您希望用户输入的属性,然后创建一些映射代码,基于ContactInput 创建一个有效的Contact

【讨论】:

    【解决方案2】:

    你应该创建 ContactDto 类

       @Data
       public ContactDto class {
        private String name;
        private String surname;
       }
    

    在@PostMapping 中,您将从用户那里获得 ContactDto。您无法将 ContactDto 保存到您的数据库中。所以你需要将ContactDto映射到Contact。您可以做的只是创建 ContractMapper 类。

    public static contactDtoToEntity(ContactDto dto){
    Contact dbContact = new Contact();
    dbContact.setName(dto.getName());
    dbContact.setSurname(dto.getSurname());
    return dbContact;
    }
    

    在将联系人保存在服务层的数据库中之前,您需要对其进行映射然后保存。 id会在数据库中生成。

    【讨论】:

      猜你喜欢
      • 2019-10-09
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 2020-10-11
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多