gpt4 book ai didi

java - 重写 JacksonJsonProvider.writeTo 时,我可以指定用于序列化的 View 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 15:11:47 25 4
gpt4 key购买 nike

我设置了 Resteasy-3.0.6、Jackson-2.2.3 和 CDI(在 Wildfly-8.0.0.CR1 上运行)。就我而言,每个实体都有一个混合类来扩展它并指定要序列化的属性。有两个“ View ”,我们称它们为基本扩展。由于我需要什么样的对象 View 取决于序列化的“根”对象,因此这些 View 需要针对每个对象。所以我为此重新使用混合类。示例:

public class Job { 
@Id private Long id;
@OneToMany(mappedBy="job") private Set<Bonus> bonuses;
}

public class Bonus {
@Id private Long id;
@ManyToOne(optional=false) private Job job;
private BigDecimal value;
}

public abstract class JsonJob extends Job {
abstract Long getId();

@JsonView({ JsonJob.class })
abstract Set<Bonus> getBonuses();
}

public abstract class JsonBonus extends Bonus {
abstract BigDecimal getValue();
}

现在,我正在寻找一种方法来 Hook jackson 的序列化过程,以将 JsonJob 指定为 View ,前提是根实体是 Job。我目前正在使用 JacksonJsonProvider#writeTo:

@Override
public void writeTo(Object value, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException {
Class view = getViewForType(type); // if no mix-in class is set, return Object
ObjectMapper mapper = locateMapper(type, mediaType);

// require all properties to be explicitly specified for serialization
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
mapper.registerModule(new SerializationMixinConf()); // registers all mix-ins

super.writeTo(value, type, genericType, annotations, mediaType,
httpHeaders, entityStream);
}

重点是:这有效,当且仅调用方法被注释为@JsonView但是由于它的主要用户是通用父类(super class),因此我无法直接将注释添加到方法中。有人可以建议一种方法来在现有映射器中设置 View (setSerializationConfig() 似乎在 jackson-2 中消失了)或动态地将 @JsonView 添加到 注释数组?

最佳答案

这是我现在在 writeTo 中的内容:

ObjectMapper mapper = locateMapper(type, mediaType);
// require all properties to be explicitly specified for serialization
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
mapper.registerModule(new SerializationMixinConf());

// TODO: check if we already have @JsonView
Annotation[] myAnnotations = Arrays.copyOf(annotations, annotations.length + 1);
myAnnotations[annotations.length] = new JsonViewQualifier(view);

super.writeTo(value, type, genericType, myAnnotations, mediaType,
httpHeaders, entityStream);

限定符只是从 AnnotationLiteral 延伸而来。 :

public class JsonViewQualifier extends AnnotationLiteral<JsonView> 
implements JsonView {
private final Class[] views;

public JsonViewQualifier(Class[] views) { this.views = views; }
public JsonViewQualifier(Class view) { this(new Class[] { view }); }

@Override
public Class<?>[] value() {
return views;
}
}

请注意,这将为每个 View 生成一个编写器(正如它应该的那样)。

关于java - 重写 JacksonJsonProvider.writeTo 时,我可以指定用于序列化的 View 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21253114/

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