相关疑难解决方法(0)

杰克逊 - @JsonTypeInfo属性被映射为null?

我正在处理这个问题.假设我有这样的回答:

{  
    "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)

java jackson json-deserialization

44
推荐指数
2
解决办法
3万
查看次数

Spring @RequestBody包含不同类型的列表(但是相同的接口)

假设我有一个域类:

    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类?

java spring json spring-mvc

18
推荐指数
2
解决办法
9304
查看次数

REST 如何实现多态 POST 端点:抽象类型需要映射到具体类型

我在 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)

因此,类ContractUpdateMessageSingleContractUpdateMessage仅在几个字段上有所不同。

我有一个 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)

java rest spring

6
推荐指数
2
解决办法
2044
查看次数

标签 统计

java ×3

spring ×2

jackson ×1

json ×1

json-deserialization ×1

rest ×1

spring-mvc ×1