首页 > 解决方案 > 如果 POJO 扩展了 Spring Jackson 中的抽象类,如何忽略它的大小写?

问题描述

我知道我们可以通过在 application.yml 中添加属性来忽略输入 JSON 的大小写:

spring:
  jackson:
    mapper:
      accept_case_insensitive_properties: true

但是,如果我的 POJO 扩展了一个抽象类,它就不起作用,并且我的 JSON 也没有被解析。

我的抽象类:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "event")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Orders.class, name = "orders"),
        @JsonSubTypes.Type(value = WorkOrders.class, name = "workOrders")
})
public abstract class ElasticDocument {
// Fields and getter/setter
}

我的波乔:

@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class Orders extends ElasticDocument {
//other fields

private List<OrderLine> orderLines;

}

我从输入中获得的输入 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

标签: javaspringspring-bootjacksonjackson2

解决方案


我想你忘了添加@type到你的请求 JSON 中。@type是识别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
}

工单.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"
}

推荐阅读