gpt4 book ai didi

java - jackson 混音 : to deserialize routeId

转载 作者:行者123 更新时间:2023-12-01 19:10:24 26 4
gpt4 key购买 nike

我正在使用 Jackson Mixin 来反序列化 mongo 对象,Mixin 如下所示。

public interface MyMixin {
/**
* Mixin to set key value for pojo.
* @param key key
* @param value value
*/
@JsonAnySetter
void put(String key, Object value);
}

mixin 对于所有字段都非常有效,包括除 id 字段之外的列表。pojo 如下所示。

public class MyPojo {
@JsonProperty("_id")
@javax.persistence.Id
private String id;
private String name;
}

异常

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.lang.String out of START_OBJECT token at [Source: (String)"{"_id": {"$oid": "5e049cb30eb7811fec0c7029"}

我知道它无法从嵌套 json 反序列化字符串。我解决问题的一种方法是编写自定义映射器

 public static MyPojo map(final Document document) {
final MyPojo pojo = new MyPojo();
pojo.setUd(document.getObjectId("_id").toHexString());
// set other fields
return pojo;

但这需要在 pojo 发生更改、添加/删除字段时更改映射器。Mixin 无需任何更改即可工作,我该如何更新我的 Mixin 来处理 objectId?

最佳答案

我不确定是否可以使用 mixin 以通用方式处理这种情况。我提出了一种与 mixin 没有太大关系的解决方案,但提供了一种反序列化此类字段的通用方法。首先创建一个类来表示json id:

@Getter @Setter
public class OidId {
@JsonProperty("$oid")
private String oid;
}

然后是一个具有映射内容的抽象类:

public abstract class HasOidId {

// moved from MyPojo
@JsonProperty("_id")
@javax.persistence.Id
private String id;

@JsonSetter("_id") // this is the trigger for mapping "_id" stufff
public void setId(OidId oidId) {
this.id = oidId.getOid();
}
}

然后让MyPojo在上面扩展:

@Getter @Setter
public class MyPojo extends HasOidId {
private String name;
}

关于java - jackson 混音 : to deserialize routeId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59488237/

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