最近在学习spring MVC,这是背景,spring MVC中我最喜欢的是他在返回JSON的时候直接在该方法上添加一个@Responsebody的注解就行了,然后返回的时候便直接是JSON格式,还不用自己去转换,颇为方便。而在与hibernate搭配的时候则郁闷了,hibernate中可以配置ManyToMany,而且还会自动将关联的字段取出来,比如Role和Resource这两个类,定义的时候两者关联,在获取Role的时候会获取Resource,而获取Resource的时候又去获取Role,于是便死循环了。
当然hibernate中有Lazy加载模式,正常使用时没问题的,可是在转换JSON的时候便开始需要使用了,于是,重复加载成了必然。所以一旦两个类的关系建立了起来,查询的时候便直接死循环了。具体表现是报如下错误
WARNING: Handling of [org.springframework.http.converter.HttpMessageNotWritableException] resulted in Exception
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
HTTP消息无法写入错误,从这点可以看出他的问题出现环节是在消息转换的方面(实际寻找起来可没这么顺利),于是调试跟踪,发现问题出在转换JSON的环节,稍一分析还是前文说到的死循环的问题,于是找到里面用到的Jackson的jar包,发现里面有个com.fasterxml.jackson.annotation的包,于是打开一看里面好多class,找到一个JsonIgnore的class文件,从字面上理解估计是我要的,于是开始尝试,果断解决。。
解决方式:在Role中的resources字段上加上注释:@JsonIgnore,完全OK有木有啊。。