如果 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