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

Posted

技术标签:

【中文标题】如果 POJO 扩展了 Spring Jackson 中的抽象类,如何忽略它的大小写?【英文标题】:How to ignore case for POJO if it extends an abstract class in Spring Jackson? 【发布时间】:2020-05-30 23:36:13 【问题描述】:

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

【问题讨论】:

accept_case_insensitive_properties 用于反序列化传入的 json (fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/…)。这是你的情况吗?或者您是否需要使用 MyProperty 中的 myProperty 创建一个 json? 是的,这就是我的情况。我在我的问题中解释了我需要将输入 json 反序列化为我的抽象类实现之一。 反序列化字在您的问题中不存在:s。 #1 尝试在解散过程后比较传入的 json、pojo 和 null 值来改进您的问题。 #2 使用 accept_case_insensitive_properties 对您来说是强制性的吗?有几种方法可以满足您的要求 【参考方案1】:

我认为您忘记在请求 JSON 中添加 @type@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

***Controller.java

@RestController
@RequestMapping("/api/v1")
public class ***Controller 

    @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"

【讨论】:

为了获取类型信息,我在 json 中添加了名为 event 的属性,正如我上面提到的 @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "event") 中的 ElasticDocument 类。我也更新了有问题的输入 json。我也会尝试你的解决方案,并会在这里更新。谢谢。

以上是关于如果 POJO 扩展了 Spring Jackson 中的抽象类,如何忽略它的大小写?的主要内容,如果未能解决你的问题,请参考以下文章

如果xml元素命名约定与POJO属性命名约定不同,则发送到Spring Boot REST API的XML元素不会映射到POJO

如果 xml 元素命名约定与 POJO 属性命名约定不同,则发送到 Spring Boot REST API 的 XML 元素不会映射到 POJO

Spring IoC的概念

Spring IoC和AOP使用扩展

spring

Spring框架由来及IOC的基本概念