Как игнорировать регистр для POJO, если он расширяет абстрактный класс в Spring Jackson? - PullRequest
1 голос
/ 15 февраля 2020

Я знаю, что мы можем игнорировать регистр для ввода JSON, добавив свойство в application.yml как:

spring:
  jackson:
    mapper:
      accept_case_insensitive_properties: true

Но если мой POJO расширяет абстрактный класс, он не работает, и мой JSON не обрабатывается

{
  "event": "orders", 
  "OrderNo": 12345,
  "Status": "Created",
  "CustomerZipCode": "23456",
  "CustomerFirstName": "firstname1",
  "orderType": "PHONEORDER",
  "customerLastName": "lastname1",
  "OrderLines": [
    {
      "LineName": "sample"
    }
  ]
}

Мой метод контроллера, где я использую этот ElasticDocument объект:

@PostMapping("save")
public Orders save(@RequestBody ElasticDocument elasticDocument) {
    return elasticsearchRepository.save((Orders) elasticDocument);
}

Я использую Spring-boot version 2.2.4

1 Ответ

1 голос
/ 15 февраля 2020

Я думаю, что вы забыли добавить @type к вашему запросу JSON. @type - определить тип сериализуемого ElasticDocument.

Вот пример, который я пробовал в своем локальном система с минимальным количеством полей в классе:

ElasticDocument. java

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes({
        @JsonSubTypes.Type(value = Orders.class, name = "Orders"),
        @JsonSubTypes.Type(value = WorkOrders.class, name = "workOrders")
})
public abstract class ElasticDocument {
    private Integer docId;
    private String docName;
   // getters and setters
}

Заказы. java

public class Orders extends ElasticDocument{
    private Integer orderId;
    private String orderName;
    // getters and setters
}

WorkOrders. java

public class WorkOrders extends ElasticDocument{
    private Integer workOrderId;
    private String workOrderName;
    // getters and setters
}

StackOverflowController. java

@RestController
@RequestMapping("/api/v1")
public class StackOverflowController {

    @PostMapping("/orders")
    ElasticDocument createOrder(@RequestBody ElasticDocument order){
        return order;
    }
}

Когда я отправляю подобные данные моя конечная точка (обратите внимание, что имена атрибутов в json строчные)

{
    "@type":"workOrders",
    "docId":123,
    "docName":"XXXX",
    "orderid":45,
    "ordername":"shoe",
    "workorderid":324,
    "workordername":"dsf"
}

Преобразовывается в ответ workOrders:

{
    "@type": "workOrders",
    "docId": 123,
    "docName": "XXXX",
    "workOrderId": 324,
    "workOrderName": "dsf"
}

И когда я изменил @type на Orders в запросе, тогда я получу ответ заказа:

{
    "@type": "Orders",
    "docId": 123,
    "docName": "XXXX",
    "orderId": 45,
    "orderName": "shoe"
}
...