Ste*_*ich 5 spring jackson jackson-databind
我得到了以下课程:
@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 {
...
}
Run Code Online (Sandbox Code Playgroud)
现在,当我序列化MySubEntity包装在OptionalJSON 中的不包含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) {
...
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我用一个简单的 Spring REST 控制器和两个测试制作了一个 SSCCE。第一个测试是ObjectMapper直接使用,虽然clazz缺少,但反序列化成功。第二个测试调用 REST 控制器并失败并显示错误,因为clazz缺少:
提取类型 [class com.example.demo.MySubEntity] 和内容类型 [application/json;charset=UTF-8] 的响应时出错;嵌套异常是 org.springframework.http.converter.HttpMessageNotReadableException:JSON 解析错误:尝试解析 [简单类型,类 com.example.demo.MySubEntity] 的子类型时缺少类型 ID:缺少类型 id 属性“clazz”;嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidTypeIdException:尝试解析 [简单类型,类 com.example.demo.MySubEntity] 的子类型时缺少类型 ID:缺少类型 id 属性“clazz”
这确实看起来像一个错误。对于这种情况,我可以建议一种解决方法,即使用JsonTypeInfo.As.EXISTING_PROPERTY字段并将其添加clazz到您的Entity. 这种方法只有一种情况是必须clazz在 java 代码中手动设置。然而,这很容易克服。以下是建议解决方法的完整代码:
@JsonIdentityInfo(
generator = ObjectIdGenerators.IntSequenceGenerator.class,
property = "oid"
)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY, //field must be present in the POJO
property = "clazz")
@JsonSubTypes({
@JsonSubTypes.Type(value = MySubEntity.class, name = "MySubEntity"),
})
public abstract class Entity {
@JsonProperty
private String uuid;
//Here we have to initialize this field manually.
//Here is the simple workaround to initialize in automatically
@JsonProperty
private String clazz = this.getClass().getSimpleName();
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15123 次 |
| 最近记录: |