У меня есть 2 сущности, указанные ниже:
@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;
}
Я намерен вставить объект продукта в базу данных, поэтому, если позже я воспользуюсь командой 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"
}
}
API для вызова POST представлен ниже:
@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);
}
}
Запрос cURL предоставляется,
$ curl -i -X POST -H "Content-Type:application/json" -d "{\"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 201
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 15 Feb 2019 09:10:59 GMT
{"timestamp":"2000-07-16 22:54:01.754"}
Однако записи в базе данных неверны,
Как правильно написать запрос cURL POST?
С помощью команды CURL я хотел бы заполнить таблицы данными, и ответ должен вернуть то же самое,
{ "productId": "Идентификатор продукта" "requestTimestamp": "2017-07-16 22:54:01.754"
"склад": {
"id": "Stock ID",
"timestamp": "2000-07-16 22:54:01.754",
"quantity": "250"
} }
Лучше использовать расширение PostMan для Chrome, если намерение пользователя — только тестирование. если вы хотите добиться чего-то еще с помощью этого завитка, я предлагаю вам поместить журналы и посмотреть, какое тело вы получаете на своем сервере, и каков статус после того, как вы сохраните его в базе данных.
@Jens сущности не находятся в контроллере/классе API
@ShivangAgarwal журнал cURL указан в вопросе. Я ничего не получаю в таблице Stock, а также поле идентификатора продукта не заполняется должным образом.
@Arefe А какой класс здесь Product: public ResponseEntity<Product> createProduct(@RequestBody Product product) {?
Я не говорю об ответе curl, я прошу вас получить тело запроса на стороне сервера и распечатать его, чтобы проверить, получаете ли вы правильные данные на своем сервере. 201, так как ответ curl не гарантирует правильную передачу данных.




Похоже, что поле Timestamp не десериализуется, вам нужно аннотировать поле Timestamp с помощью @JsonFormat, например:
@JsonFormat(pattern = "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;
}
}
Здесь — это документация.
Обновить
Для Stock вам нужно передать его как вложенный объект, чтобы придерживаться структуры класса Product, например:
{
"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
Хорошо, это помогает, поскольку я забыл добавить аннотацию. Поэтому я добавил `@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")` в обе таблицы. Однако вопросы все еще существуют, поскольку я не смог заполнить другие столбцы для двух таблиц. Пожалуйста, обратите внимание на запросы cURL, так как все данные должны находиться внутри таблиц.
Я действительно ожидал, что это сработает, поскольку это кажется очень логичным. Однако у меня до сих пор нет записей в базе данных.
Можете ли вы проверить, заполняется ли объект Stock в контроллере? sysout подойдет.
Теперь я получаю ошибку HTTP 400 при выполнении исходного запроса curl -i -X POST -H "Content-Type:application/json" -d "{\"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 Connection: close {"timestamp":"2019-02-15T10:14:52.338+0000","status":400,"error":"Bad Request","message":"I/O error while reading input message; nested exception is java.io.IOException: Stream closed","path":"/api/v1/products/createProduct"}
Это то, что я пытаюсь исправить и вернуться к вам позже.
Не используйте сущности в классе контроллера. Узнайте о трехуровневой архитектуре