如果在Spring Jackson中扩展了抽象类,如何忽略POJO的大小写?

问题描述 投票:0回答:1

我知道我们可以通过在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
}

我的Pojo:

@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对象的contoller方法:

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

我正在使用Spring-boot version 2.2.4

java spring spring-boot jackson jackson2
1个回答
0
投票

[我认为您忘记了将@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
}

Orders.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"
}
© www.soinside.com 2019 - 2024. All rights reserved.