【问题标题】:How to send a specific POST request to an API using Spring Boot如何使用 Spring Boot 向 API 发送特定的 POST 请求
【发布时间】:2018-06-07 15:08:54
【问题描述】:

我想为我的 Spring Boot 应用程序的控制器创建一个 Post 方法,我有一个实体警报,包含以下元素,但我需要向我的 API 发送特定的请求格式,我尝试使用 save() 方法但它不起作用,有人知道如何为 Json 请求指定每个元素吗?以及当我们使用 Serializable 时如何转到下一个元素?非常感谢您的帮助

{
  "deviceEUIs": [
    "1122233344"
  ],
  "alertModes": [
    {
      "type": "MOTION",
      "notifyByEmail": true,
      "notifyBySMS": true,
      "notifyOnInterface": true
    }
  ]
}


@Entity
@Table(name = "Alert")
public class Alert implements Serializable{

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    private UUID alertRef;

    @OneToMany(mappedBy = "alert", cascade = CascadeType.ALL)
    private Set<AlertModes> alertModes;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable
    private Set<Subscriber> subscribers;

    @ManyToMany(mappedBy = "alerts")
    private Set<Device> devices;

    @Column(name = "last_update", columnDefinition = "DATETIME", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastUpdate;

对于我的控制器:

@RestController
@RequestMapping("/api/alerts")
public class AlertsController extends AbstractController{
         @Autowired
         private AlertRepository alertRepository;
         @PostMapping()
         public void createAlert(@RequestBody Alert alert) {
                    alertRepository.save(alert);
         }
 }

【问题讨论】:

  • 调试你的应用程序,在alertRepository.save(alert);上设置断点,看看spring得到什么作为你的对象。
  • 我得到了这个:原因:org.mariadb.jdbc.internal.util.dao.QueryException:列'last_update'不能为空

标签: java json api spring-boot controller


【解决方案1】:

您所做的一切都是正确的,但没有对您的空警报实例做任何事情,因此没有发布任何内容。为了发布一些内容,您需要执行类似 alert.setSomething(something) 和 alertRepository.save(alert) 之类的操作,因为您目前没有保存任何内容

【讨论】:

  • 不正确 @RequestBody 将 post 对象映射到 POJO
  • 是的,我试过了,但其他元素仍然是空的,所以它给出了一个错误,说它们不能为 NULL。
【解决方案2】:

您很可能需要创建正确的设备对象。

{
    devices:[
        {
        "deviceEUIs": "1122233344"
        },{
        "deviceEUIs": "1122233355"}
    ]
}

对于您在上面的评论中发布的错误。将此添加到实体。

 @PrePersist
 @PreUpdate
 public void onUpdate() {
      lastUpdate= new Date();
 }

有一个解决方案here 向您展示了如何在超类中使用它并继承您希望拥有这些字段的所有类。

【讨论】:

  • 在我的 API 合同中,我有:{ deviceEUIs:[ "1122233344","1122233355" ] }
【解决方案3】:

你试过用吗:

@Column(nullable=false)
@Temporal(TemporalType.TIMESTAMP)
@LastModifiedDate // 这会在对象更改时自动生成一个新日期。
私人日期更新时间;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2017-10-16
    相关资源
    最近更新 更多