7

好吧,我正在使用 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

任何人都可以帮助我吗??

4

4 回答 4

23

你可以试试

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

或者一种相当简单的方法是使用 @JsonProperty 手动注释每个 getter

于 2013-08-27T16:08:46.863 回答
3

如果你有一个实体与另一个实体有关系,Hibernate 会用所谓的 PersistenceBag 替换列表或引用的类。这使得做一些延迟加载成为可能。我认为这与您的会话属性有关。如果我是对的,您应该能够在从 DB 加载广告后立即在调试器中看到这一点。

我不知道 Json 序列化程序如何处理这种休眠魔法。也许您必须首先将实体复制到 pojo dto(没有任何 Hibernate-Context 的类)中,然后将该 dto 序列化为 json ...

但也许有更好的方法来做到这一点。您可以尝试停用延迟加载,但我不确定这是否真的改变了休眠行为......

于 2013-08-27T16:14:12.977 回答
2

当 Hibernate 从数据库加载对象时,它会返回代理对象,这些代理对象看起来像您的 Advertisment 或 SessionT,但其中包含更多“东西”(处理它们与会话的关系、延迟加载集合的内部状态等)。

这会抛出 Jackson 序列化程序,因为它依赖自省来查找对象的属性。

有一个项目可以让 Jackson 与 Hibernate 实体一起工作。请参阅:https ://github.com/FasterXML/jackson-datatype-hibernate 。

于 2013-08-27T16:22:03.473 回答
1

如上所述Christophe L,使用 Hibernate 模块:https ://github.com/FasterXML/jackson-datatype-hibernate——否则 Jackson 无法知道如何处理特定于第三方库的类型。

此外,Jackson 2.x 对此类外部类型有更好的支持,因此如果可能的话,带有 Hibernate 模块的 Jackson 2.2 将是更佳的选择。但我知道升级并不总是容易或可能的。

于 2013-08-27T19:01:22.547 回答