Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将Hibernate对象序列化为JSON时引发异常_Java_Hibernate_Jackson - Fatal编程技术网

Java 将Hibernate对象序列化为JSON时引发异常

Java 将Hibernate对象序列化为JSON时引发异常,java,hibernate,jackson,Java,Hibernate,Jackson,我使用Hibernate将一个小数据库加载到一些表示表的类中,并与数据库交互。 一切都很好,我真的可以看到所有的结果。。。我没有任何空字段,所有字段都已被使用 这里我展示了“main”类(表) 而且 @JsonAutoDetect public class SessionT { @Id @GeneratedValue(strategy=GenerationType.AUTO) public int id; public int i

我使用Hibernate将一个小数据库加载到一些表示表的类中,并与数据库交互。 一切都很好,我真的可以看到所有的结果。。。我没有任何空字段,所有字段都已被使用

这里我展示了“main”类(表)

而且

    @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 Studio 6.01

有人能帮我吗?

你能试一下吗

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

或者,一种相当简单的方法是使用@JsonProperty手动注释每个getter。如果您有一个与另一个实体有关系的实体,Hibernate将用所谓的PersistenceBag替换列表或引用的类。这使得进行一些延迟加载成为可能。我认为这种情况发生在会话属性中。 如果我是对的,那么在从DB加载Advertisent之后,您应该能够在调试器中看到这一点

我不知道Json序列化程序如何处理这个hibernate魔术。也许您必须首先在pojo dto(一个没有任何Hibernate上下文的类)中复制您的实体,然后将该dto序列化为json


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

当Hibernate从DB加载对象时,它会返回代理对象,这些代理对象看起来像您的广告或会话,但里面有更多的“东西”(处理它们与会话的关系、延迟加载集合的内部状态等)

这抛弃了Jackson序列化程序,因为它依赖于内省来查找对象的属性


有一个项目可以让Jackson使用Hibernate实体。请参阅:.

如上文所述,使用Hibernate模块:——否则Jackson无法知道如何处理特定于第三方库的类型


另外,jackson2.x对这种外部类型有更好的支持,所以如果可能的话,带有Hibernate模块的jackson2.2将是更好的选择。但我明白升级并不总是容易或可能的。

已经用@JsonProperty手动注释了每个getter。。。我将尝试@JsonIgnoreProperties({“hibernateLazyInitializer”,“handler”})是的,我认为这个错误是因为Jackson试图在对象完全加载之前序列化。看起来广告和会话是延迟加载的,即当JSON序列化开始时,它还没有加载。让我知道它是否解决了问题。这很有趣。在某些情况下,当惰性加载的集合已经从数据库中获取时,这会起作用,但在其他情况下,很可能会产生意外的结果(异常、缺少数据等)。YMMV,但我建议您签出我的回答中提到的jackson数据类型hibernate模块(并升级您的jackson版本,因为它们从CodeHaus迁移到了FasterXML,用于更新的版本)。这对我来说是可行的,但请注意,如果您使用的是PropertyNamegstrategy.LowercasewiredCoresstrategy()注释应该是:@JsonIgnoreProperties({“hibernate\u lazy\u initializer”,“handler”}),您在调试器中看到会话值的类型了吗?那是别的事吗?如果不是,我的想法就错了;-)对我来说,我不得不将FetchType.LAZY改为FetchType.Wanger。现在在你的帮助下,我明白了这会对项目中使用此版本的jackson造成什么影响。我最初尝试使用上面的示例,但它不起作用。所以现在我可以生产更多。。。在我所有的代码中,jackson真的很少,很明显,随着复杂性的增长,jackson将增长到。。。但在这种情况下,我肯定会得到帮助(更多的程序员)。。。现在只有我一个人,事情必须顺利进行!!谢谢你对我的耐心!!感谢大家在这个特殊性中给予的所有支持!!!现在该项目几乎处于中期,另一个更有经验的程序员会给我更多的支持,我会向他展示你的所有评论,看看他是否能做出所有建议的更改!我尝试了您的建议,使用Wildfly 8.1.0和Hibernate 4.3.5.Final创建RESTful界面。非常好用,谢谢!
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})