【发布时间】:2018-12-29 08:41:03
【问题描述】:
我正在为 Spring Boot 应用程序设置一个控制器。我希望控制器根据传入的 JSON 字符串的键值对生成接口实现的实例。
界面:
public interface ShoppableItem {}
实施1:
public class GroceryItem implements ShoppableItem {
@JsonProperty("transactionId")
private Long transactionId;
@JsonProperty
@NotNull
private String itemName;
@JsonProperty
@NotNull
private Float weight;
}
实施2:
public class ClothingItem implements ShoppableItem {
@JsonProperty("transactionId")
private Long transactionId;
@JsonProperty
@NotNull
private String itemName;
}
(注意:如果提供了重量,则为杂货,不能为空或“”。如果未提供重量,则为服装)。
控制器
@Controller
public class Total {
@PostMapping(value = "total")
@ResponseStatus(HttpStatus.ACCEPTED)
public String tester(@Valid @RequestBody ShoppableItem shoppableItem) {
return shoppableItem.toString();
}
}
JSON 正文
{
"transactionId" : "123",
"itemName" : "whatever"
}
期望的结果是创建 ClothingItem 类型的实例。当我尝试这样做时,出现以下异常:
org.springframework.http.converter.HttpMessageNotReadableException:JSON 解析错误:无法构造 com.test.controllers.Models.ShoppableItem 的实例:抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么包含其他类型信息;嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException:无法构造 com.test.controllers.Models.ShoppableItem 的实例:抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么包含其他类型信息
这是我没有正确实现的功能吗?我知道这可能不是最好的方法,因为只创建 2 个端点来处理每种情况会更容易。
【问题讨论】:
标签: java json spring-boot jackson