我知道我们可以通过在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
[我认为您忘记了将@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"
}