我正在使用hibernate从数据库中懒惰地检索内容。 然后将这个内容序列化为json输出,问题是jackson调用了来自hibernate的“persistentBag”的getter,以“no session or session was closed”异常结束。
事实上,我想告诉杰克逊“如果列表没有加载(意味着它是否是持久化的标签),那么就不要将它序列化”
实现这一目标的最佳方法是什么?任何jackson配置从序列化中删除persistentBag? 我应该使用reflect api将persistentBag设置为新的空列表吗?
什么是最好的?谢谢你们,祝新年快乐!
答案 0 :(得分:0)
您可以尝试使用@JsonIgnore
完全忽略已标记的属性。明智的注释我认为没有“如果有点”选项。
你当然可以做的就是编写自己的编组,检查类型并决定如何继续。
我有例如为自定义数据类型编写了一个序列化程序
public class PropertyValueSerializer extends JsonSerializer<PROPERTY_VALUE> {
@Override
public void serialize(PROPERTY_VALUE property_value, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeStartObject();
jsonGenerator.writeFieldName(property_value.getKey());
jsonGenerator.writeString(property_value.getValue());
jsonGenerator.writeEndObject();
}
}
然后通过添加一些注释将其用于序列化该类型:
@JsonSerialize(using = PropertyValueSerializer.class)
@JsonDeserialize(using = PropertyValueDeserializer.class)
public class PROPERTY_VALUE implements Serializable{
private String key;
private String value;
自定义序列化程序为您提供了完全控制,但实现的工作当然要比简单的注释更多。
答案 1 :(得分:0)
我首先考虑Jackson Hibernate module,因为它增加了一些特定于Hibernate的东西的支持,比如处理延迟加载。 它也可以扩展为允许禁用尚未加载的集合的输出,因为它已经知道如何在需要时延迟加载集合。
此外,通常您可以使用
来阻止输出空集合@JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY)
当且仅当它至少有一个元素时才会添加匹配属性。