簡體   English   中英

將 Hibernate 對象序列化為 JSON 時拋出異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM