Правильно выполнить запрос cURL

У меня есть 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Правильно выполнить запрос cURL

Как правильно написать запрос 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"

} }

Не используйте сущности в классе контроллера. Узнайте о трехуровневой архитектуре

Jens 15.02.2019 10:08

Лучше использовать расширение PostMan для Chrome, если намерение пользователя — только тестирование. если вы хотите добиться чего-то еще с помощью этого завитка, я предлагаю вам поместить журналы и посмотреть, какое тело вы получаете на своем сервере, и каков статус после того, как вы сохраните его в базе данных.

Shivang Agarwal 15.02.2019 10:21

@Jens сущности не находятся в контроллере/классе API

Arefe 15.02.2019 10:23

@ShivangAgarwal журнал cURL указан в вопросе. Я ничего не получаю в таблице Stock, а также поле идентификатора продукта не заполняется должным образом.

Arefe 15.02.2019 10:24

@Arefe А какой класс здесь Product: public ResponseEntity<Product> createProduct(@RequestBody Product product) {?

Jens 15.02.2019 10:26

Я не говорю об ответе curl, я прошу вас получить тело запроса на стороне сервера и распечатать его, чтобы проверить, получаете ли вы правильные данные на своем сервере. 201, так как ответ curl не гарантирует правильную передачу данных.

Shivang Agarwal 15.02.2019 10:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
272
1

Ответы 1

Похоже, что поле 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, так как все данные должны находиться внутри таблиц.

Arefe 15.02.2019 10:21

Я действительно ожидал, что это сработает, поскольку это кажется очень логичным. Однако у меня до сих пор нет записей в базе данных.

Arefe 15.02.2019 10:42

Можете ли вы проверить, заполняется ли объект Stock в контроллере? sysout подойдет.

Darshan Mehta 15.02.2019 10:44

Теперь я получаю ошибку 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,"er‌​ror":"Bad Request","message":"I/O error while reading input message; nested exception is java.io.IOException: Stream closed","path":"/api/v1/products/createProduct"}

Arefe 15.02.2019 11:16

Это то, что я пытаюсь исправить и вернуться к вам позже.

Arefe 15.02.2019 11:16

Другие вопросы по теме