gpt4 book ai didi

java - 再次在派生类中添加Jackson中的字段,该字段在基类中已被忽略

转载 作者:行者123 更新时间:2023-12-02 13:33:01 27 4
gpt4 key购买 nike

我在Jackson遇到了一个奇怪的现象:我为基类 (AbstractPercientObject) 添加了一个 mixin,其中仅包含字段 (id) 的 @JsonIgnore,因为我想在所有派生类中抑制它。这效果很好。

现在我想为一个派生类 (Product) 导出该字段。

因此我为此类配置了一个 mixin,如下所示:

@JsonAppend(                attrs = {                    @JsonAppend.Attr(value="id", include=Include.ALWAYS)                }            )...

此方法有效,因为现在已为此实体导出该字段,但其值始终指定为 null,其中对象中该字段的值绝对不为 null。怎么会?我该怎么做才能使该字段及其正确值重新出现在生成的 JSON 中?

我还尝试使用其他名称导出此字段,在 @JsonAppend 中指定 propName="productId",但这个新命名的字段也始终具有值

此外,上述 mixin 中的 @JsonProperty("productId") public abstract String getId(); 不起作用;该字段没有再次出现。

也许无法在派生类中正确处理基类的属性?

我绝对不想在除该派生类之外的每个派生类中排除该字段,因为派生类的数量相当多;可能还会有更多,必须以同样的方式对待(然后我就会忘记;o)。

我使用 Jackson 2.6.7。

最佳答案

经过漫长而令人沮丧的调查,我终于找到了一个可行的解决方案。我需要编写 VirtualBeanPropertyWriter 的子类,它返回对象的 id 字段的值:

public class VirtualBeanProductIdPropertyWriter extends VirtualBeanPropertyWriter {

public VirtualBeanProductIdPropertyWriter() {
}

public VirtualBeanProductIdPropertyWriter(BeanPropertyDefinition propDef, Annotations contextAnnotations, JavaType declaredType)
{
super(propDef, contextAnnotations, declaredType);
}

@Override
protected Object value(Object bean, JsonGenerator jgen, SerializerProvider prov) throws Exception {
if(bean instanceof AbstractPersistentObject) {
return ((AbstractPersistentObject) bean).getId();
}
return null;
}

@Override
public VirtualBeanPropertyWriter withConfig(MapperConfig<?> config, AnnotatedClass declaringClass, BeanPropertyDefinition propDef, JavaType type) {
return new VirtualBeanProductIdPropertyWriter(propDef, null, type);
}
}

并在 mixin 中进行如下配置:

@JsonAppend(prepend=true, 
props = {
@JsonAppend.Prop(name="productId", value=VirtualBeanProductIdPropertyWriter.class, include=Include.ALWAYS, required=true)
}
)
...

看起来确实像带有 attrs 的变体无法引用继承的属性。

关于java - 再次在派生类中添加Jackson中的字段,该字段在基类中已被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43117140/

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