[英]Strange Jackson exception being thrown when serializing Hibernate object
[英]Exception thrown when serializing Hibernate object to JSON
好吧,我正在使用 Hibernate 将一个小数据库加载到一些表示表的类并与数据库交互。 一切都很好,我真的可以看到所有结果......而且我没有任何空字段,它们都被使用了。
这里我展示了“主”类(表)。
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonProperty;
@JsonAutoDetect
public class Advertisement {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int id;
public SessionT session;
public int idRoom;
public String image;
public Advertisement() {
}
/* Getters and Setters */
@JsonProperty
public int getID() /* Get example */ {
return this.id;
}
}
并且
@JsonAutoDetect
public class SessionT {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int id;
public int iStatus;
public String sStatus;
public Date dtDateStart;
public Date dtDateEnd;
public boolean bhide;
/* Constructor, Getter and Setters*/
}
我的目标是从广告列表生成 JSON 并通过 Http 发送。
ObjectMapper mapper = new ObjectMapper();System.out.println("mapper started!");
mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
response.getOutputStream().println(mapper.writeValueAsString(ads));
出于某种原因,我收到以下错误:
org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: java.util.ArrayList[0]->entities.slave.Advertisement["session"]->entities.slave.SessionT_$$_javassist_2["hibernateLazyInitializer"])
我正在使用 jackson-all-1.9.11 和 JBoss Studios 6.01
谁能帮帮我??
你可以试试
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
或者一个相当简单的方法是使用 @JsonProperty 手动注释每个 getter
如果您有一个与另一个实体有关系的实体,Hibernate 会用所谓的 PersistenceBag 替换列表或引用的类。 这使得进行一些延迟加载成为可能。 我认为这与您的会话属性有关。 如果我是对的,您应该能够在从数据库加载广告后立即在调试器中看到它。
我不知道 Json 序列化程序如何处理这种休眠魔术。 也许您必须首先将实体复制到 pojo dto(一个没有任何 Hibernate-Context 的类)中,然后将该 dto 序列化为 json ...
但也许有更好的方法来做到这一点。 您可以尝试停用延迟加载,但我不确定这是否真的改变了休眠行为...
当 Hibernate 从数据库加载对象时,它会返回代理对象,这些对象看起来像您的广告或 SessionT,但其中包含更多“内容”(以处理它们与会话的关系、延迟加载集合的内部状态等)。
这抛弃了 Jackson 序列化器,因为它依赖于自省来找到我们对象的属性。
有一个项目可以让 Jackson 与 Hibernate 实体一起工作。 请参阅: https : //github.com/FasterXML/jackson-datatype-hibernate 。
正如上面提到的Christophe L
,请使用 Hibernate 模块: https : //github.com/FasterXML/jackson-datatype-hibernate——否则 Jackson 无法知道如何处理特定于第三方库的类型。
此外,Jackson 2.x 对此类外部类型有更好的支持,因此如果可能的话,带有 Hibernate 模块的 Jackson 2.2 将是更好的选择。 但我明白升级并不总是容易或可能的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.