gpt4 book ai didi

spring - Jackson java.util.Optional 序列化不包含类型 ID

转载 作者:行者123 更新时间:2023-12-04 20:29:51 28 4
gpt4 key购买 nike

我得到了以下类(class):

@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应用程序中完成。

编辑:这是返回 Optional 的 Spring REST 方法。 :
@RequestMapping(method = RequestMethod.GET, value = "/{uuid}", produces = "application/json")
public Optional<MySubEntity> findByUuid(@PathVariable("uuid") String uuid) {
...
}

编辑:
made a SSCCE使用一个简单的 Spring REST Controller 和两个测试。第一个测试是使用 ObjectMapper尽管 clazz 直接反序列化成功不见了。第二个测试调用 REST Controller 并失败并出现错误,因为 clazz不见了:

Error while extracting response for type [class com.example.demo.MySubEntity] and content type [application/json;charset=UTF-8]; nested exception is 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'; nested exception is com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class com.example.demo.MySubEntity]: missing type id property '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;
}
}

关于spring - Jackson java.util.Optional 序列化不包含类型 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49071166/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com