Java 正确执行cURL请求

Java 正确执行cURL请求,java,spring-boot,http,curl,Java,Spring Boot,Http,Curl,我有以下两个实体: @Entity public class Product { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") @Column(name = "product_id") private String id; @Column @JsonFormat(pattern="yyyy-MM

我有以下两个实体:

@Entity
public class Product {


    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(name = "product_id")
    private String id;


    @Column
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS")
    private Timestamp timestamp;

    @OneToOne(mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
    private Stock stock;
}


@Entity
public class Stock {


    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(name = "stock_id")
    private String id;


    @Column
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS")
    private Timestamp timestamp;

    @Column
    private int quantity;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "product_id")
    private Product product;
}
@RestController
@RequestMapping("/api/v1/products")
public class ProductAPI {

    @Autowired
    private ProductService service;

    @PostMapping(value = "/createProduct", consumes = "application/json", produces = "application/json")
    public ResponseEntity<Product> createProduct(@RequestBody Product product) {

        service.save(product);
        return ResponseEntity.status(HttpStatus.CREATED).body(product);
    }
}
我的目的是在数据库中插入产品对象,因此,如果以后使用GET命令,我将能够检索类似以下内容的JSON:

{
   "productId": “string", // id of the requested product, e.g. "vegetable-123" 
  "requestTimestamp": “dateTime", // datetime in UTC when requested the stock 

  "stock": {

     "id": "string", 
     "timestamp": 
     "dateTime" "quantity": "integer"

   } 
}
POST调用的API提供如下:

@Entity
public class Product {


    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(name = "product_id")
    private String id;


    @Column
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS")
    private Timestamp timestamp;

    @OneToOne(mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
    private Stock stock;
}


@Entity
public class Stock {


    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(name = "stock_id")
    private String id;


    @Column
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS")
    private Timestamp timestamp;

    @Column
    private int quantity;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "product_id")
    private Product product;
}
@RestController
@RequestMapping("/api/v1/products")
public class ProductAPI {

    @Autowired
    private ProductService service;

    @PostMapping(value = "/createProduct", consumes = "application/json", produces = "application/json")
    public ResponseEntity<Product> createProduct(@RequestBody Product product) {

        service.save(product);
        return ResponseEntity.status(HttpStatus.CREATED).body(product);
    }
}
但是,数据库条目不正确

如何正确编写curlpost请求

使用CURL命令,我想用数据填充表,响应应该返回相同的数据

{ productId:productId 请求时间戳:2017-07-16 22:54:01.754

股票:{

 "id": "Stock ID", 
 "timestamp": "2000-07-16 22:54:01.754",
 "quantity": "250"
} }

看起来时间戳字段没有反序列化,您需要用@JsonFormat注释时间戳字段,例如:

@JsonFormatpattern=yyyy-MM-dd-HH:MM:ss.SSS

以下是一个例子:

public static void main(String[] args)  throws Exception { 
    String s = "{\"timestamp\":\"2000-07-16 22:54:01.754\"}";
    ObjectMapper objectMapper = new ObjectMapper();
    Product product = objectMapper.readValue(s, Product.class);
    System.out.println(product.getTimestamp());
}

class Product {

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS")
    private Timestamp timestamp;

    public Timestamp getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Timestamp timestamp) {
        this.timestamp = timestamp;
    }
}
是文档

更新

对于库存,您需要将其作为嵌套对象传递,以符合产品类结构,例如:

{
  "id": "Product ID",
  "timestamp": "2017-07-16 22:54:01.754",
  "stock" : {
  "id": "Stock ID",
  "timestamp": "2000-07-16 22:54:01.754",
  "quantity": "250"
  }
}
您的curl命令将是:

$ curl -i -X POST -H "Content-Type:application/json" -d "{  \"id\": \"Product ID\", 
\"timestamp\": \"2017-07-16 22:54:01.754\",  \"stock\" : {  \"id\": \"Stock ID\",  
\"timestamp\": \"2000-07-16 22:54:01.754\",  \"quantity\": \"250\"  }}" 
http://localhost:8080/api/v1/products/createProduct

不要在控制器类中使用实体。了解3tier架构如果用户只想进行测试,那么最好为chrome使用PostMan扩展。如果您想通过此curl实现其他功能,那么我建议您将日志放入服务器,查看您在服务器上接收到的主体,以及将其保存到数据库后的状态。@Jens这些实体不在控制器/API中class@ShivangAgarwal问题中提供了旋度日志。我在库存表中没有得到任何信息,而且产品的id字段也没有按预期填充。@Arefe和此处的产品类别:public ResponseEntitycreateProduct@RequestBody产品{?好的,这有助于我忘记添加注释。因此,我在两个表中都添加了“@JsonFormatpattern=yyyy-MM-dd HH:MM:ss.SSS”。但是,问题仍然存在,因为我无法填充这两个表的其他列。请查看cURL查询,因为所有数据都需要进入表中,我真的希望这样做这样做似乎很合乎逻辑。但是,我在数据库中仍然没有任何条目。你能检查一下控制器中是否填充了Stock对象吗?一个sysout就可以了。现在我在执行原始查询curl-I-X POST-H Content Type:application/json-d时出现HTTP 400错误{\id\:\Product id\,\timestamp\:\2017-07-16 22:54:01.754\,\id\:\Stock id\,\timestamp\:\2000-07-16 22:54:01.754\,\quantity\:\250\}http://localhost:8080/api/v1/products/createProduct HTTP/1.1 400连接:关闭{时间戳:2019-02-15T10:14:52.338+0000,状态:400,错误:错误请求,消息:读取输入消息时发生I/O错误;嵌套异常为java.io.IOException:Stream closed,path:/api/v1/products/createProduct}这是我试图修复的问题,稍后会回复您。