我有以下课程:
@JsonIdentityInfo(
generator = ObjectIdGenerators.IntSequenceGenerator.class,
property = "oid"
)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "clazz")
@JsonSubTypes({
@JsonSubTypes.Type(value = MySubEntity.class, name = "MySubEntity"),
})
public abstract class Entity {
...
}
public class MySubEntity extends Entity {
...
}
现在,当我序列化MySubEntity
包装在Optional
JSON 中时,它不包含clazz
包含类型 ID 的属性。漏洞?当我序列化到List<MySubEntity>
或只是到MySubEntity
它工作正常。
设置:jackson-databind 2.9.4,jackson-datatype-jdk8 2.9.4,序列化在提供 RESTful Web 服务的 Spring Boot 应用程序中完成。
编辑:这是返回的 Spring REST 方法Optional
:
@RequestMapping(method = RequestMethod.GET, value = "/{uuid}", produces = "application/json")
public Optional<MySubEntity> findByUuid(@PathVariable("uuid") String uuid) {
...
}
编辑:
我用一个简单的 Spring REST 控制器和两个测试做了一个 SSCCE 。第一个测试是ObjectMapper
直接使用,它在反序列化中是成功的,尽管clazz
缺少。第二个测试调用 REST 控制器并失败并出现错误,因为clazz
缺少:
提取类型 [class com.example.demo.MySubEntity] 和内容类型 [application/json;charset=UTF-8] 的响应时出错;嵌套异常是 org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Missing type id when trying to resolve subtype of [simple type, class com.example.demo.MySubEntity]: missing type id property 'clazz'; 嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidTypeIdException:尝试解析 [simple type, class com.example.demo.MySubEntity] 的子类型时缺少类型 id:缺少类型 id 属性“clazz”