java - 如果 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
解决方案
我想你忘了添加@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"
}
推荐阅读
- aws-lambda - AWS Lambda and AWS SNS: Does it need a NAT Gateway?
- python - Query Builder Application Using Python
- azure - Azure App Insights - 将自定义属性添加到依赖调用
- mysql - 从不同表中的另一列中减去一列以将答案留在 MySQL 的另一列中
- sql - 用于将数据库从 Blob 存储还原到托管实例的 Azure 自定义脚本
- android - 将 Gradle 版本从 4.6 更改为 4.10.1 导致同步失败无效
- .net-core - 如何在 .NET Core 中从 Linux 应用程序操作 Windows 路径,反之亦然?
- haskell - 冗余模式匹配的情况
- dart - 如何通过链接在颤振应用程序中启动视频通话
- html - 动态更改 CSS 类的属性