我正在处理这个问题.假设我有这样的回答:
{
"id":"decaa828741611e58bcffeff819cdc9f",
"statement":"question statement",
"exercise_type":"QUESTION"
}
Run Code Online (Sandbox Code Playgroud)
然后,基于exercise_type属性,我想实例化不同的对象实例(子类ExerciseResponseDTO),所以我创建了这个混合:
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "exercise_type")
@JsonSubTypes({
@Type(value = ExerciseChoiceResponseDTO.class, name = "CHOICE"),
@Type(value = ExerciseQuestionResponseDTO.class, name = "QUESTION")})
public abstract class ExerciseMixIn
{}
public abstract class ExerciseResponseDTO {
private String id;
private String statement;
@JsonProperty(value = "exercise_type") private String exerciseType;
// Getters and setters
}
public class ExerciseQuestionResponseDTO
extends ExerciseResponseDTO {}
public class ExerciseChoiceResponseDTO
extends ExerciseResponseDTO {}
Run Code Online (Sandbox Code Playgroud)
所以我创建ObjectMapper如下
ObjectMapper mapper = …Run Code Online (Sandbox Code Playgroud) 假设我有一个域类:
public class Zoo{
private List<Animal> animals;
....
Run Code Online (Sandbox Code Playgroud)
其中Animal是具有不同实现的接口(Cat,Dog).假设我希望能够保存Zoo对象:
@RequestMapping(value = "/zoo", method = RequestMethod.POST)
public @ResponseBody void save(@RequestBody Zoo zoo) {
....
Run Code Online (Sandbox Code Playgroud)
我想发送一个json - 类似于:
{
animals:[
{type:'Cat', whiskers-length:'3'},
{type:'Dog', name:'Fancy'}
]
}
Run Code Online (Sandbox Code Playgroud)
当键入=='Cat'时,如何告诉spring MVC将动物映射到Cat类型,并在键入=='Dog'时将其映射到Dog类?
我在 SpringBoot 应用程序上工作。
我有以下类层次结构:
public abstract class DlqMessage {
Long id;
UUID employeeId;
EventReason reason;
}
public class ContractUpdateMessage extends DlqMessage {}
public class SingleContractUpdateMessage extends DlqMessage {
UUID benefitId;
UUID employerId;
}
Run Code Online (Sandbox Code Playgroud)
因此,类ContractUpdateMessage和SingleContractUpdateMessage仅在几个字段上有所不同。
我有一个 REST 控制器,它使用 POST 在数据库中创建和保存一个新实体:
@PostMapping("/messages")
public ResponseEntity<DlqMessage> create(@RequestBody DlqMessage contractUpdateMessage) {
DlqMesssage dlqEntry = dlqEntityService.save(contractUpdateMessage);
return ResponseEntity.ok(dlqEntry);
}
Run Code Online (Sandbox Code Playgroud)
现在,我有一个在一个或另一个类的实例上随机生成的测试:
DlqMessage message = randomOneOf(contractUpdateMessageBuilder().build(), singleContractUpdateMessageBuilder().build());
Run Code Online (Sandbox Code Playgroud)
然后我有一个测试助手类,它使用 RestTemplate 向控制器发送 POST 请求:
ResponseEntity<DlqMesssage> response =
crudRestClient.post("/messages/contract", message, DlqMesssage.class, null);
return response.getBody();
Run Code Online (Sandbox Code Playgroud)
并调用整个事情我最终有以下例外:
Failed to …Run Code Online (Sandbox Code Playgroud)