![](/img/trans.png)
[英]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.