Entity中Lazy Load的属性序列化JSON时报错

The server encountered an internal error that prevented it from fulfilling
this request.org.springframework.http.converter.HttpMessageNotWritableException:
Could not write JSON: failed to lazily initialize a collection of role:
com.party.dinner.entity.User.friends, could not initialize proxy - no Session
(through reference chain:
com.party.dinner.entity.User["friends"]); nested exception is
org.codehaus.jackson.map.JsonMappingException: failed to lazily initialize a
collection of role: com.party.dinner.entity.User.friends, could not initialize
proxy - no Session (through reference chain:
com.party.dinner.entity.User["friends"])
   
org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.writeInternal(MappingJacksonHttpMessageConverter.java:204)
   
org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:179)
   
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.writeWithMessageConverters(AnnotationMethodHandlerAdapter.java:1037)
   
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.handleResponseBody(AnnotationMethodHandlerAdapter.java:995)
   
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.getModelAndView(AnnotationMethodHandlerAdapter.java:944)
   
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:441)
   
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
   
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
   
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
   
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
   
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
   
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
   
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
   
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
  
root cause
org.codehaus.jackson.map.JsonMappingException: failed
to lazily initialize a collection of role: com.party.dinner.entity.User.friends,
could not initialize proxy - no Session (through reference chain:
com.party.dinner.entity.User["friends"])
   
org.codehaus.jackson.map.JsonMappingException.wrapWithPath(JsonMappingException.java:218)
   
org.codehaus.jackson.map.JsonMappingException.wrapWithPath(JsonMappingException.java:183)
   
org.codehaus.jackson.map.ser.std.SerializerBase.wrapAndThrow(SerializerBase.java:140)
   
org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:158)
   
org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)
   
org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:610)
   
org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256)
   
org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:1613)

转载:http://blog.csdn.net/nomousewch/article/details/8955796

jackson在实际应用中给我们提供了一系列注解,提高了开发的灵活性,下面介绍一下最常用的一些注解

  • @JsonIgnoreProperties

此注解是类注解,作用是json序列化时将java
bean中的一些属性忽略掉,序列化和反序列化都受影响。

  • @JsonIgnore

此注解用于属性或者方法上(最好是属性上),作用和上面的@JsonIgnoreProperties一样。

  • @JsonFormat

此注解用于属性或者方法上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式,比如@JsonFormat(pattern =
"yyyy-MM-dd HH-mm-ss")

  • @JsonSerialize

此注解用于属性或者getter方法上,用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点。

[java] view plaincopy

  1. public class CustomDoubleSerialize extends JsonSerializer<Double> {
  2. private DecimalFormat df = new DecimalFormat("##.00");
  3. @Override

  4. public void serialize(Double value, JsonGenerator jgen,

  5. SerializerProvider provider) throws IOException,

  6. JsonProcessingException {
  7. jgen.writeString(df.format(value));

  8. }

  9. }

  • @JsonDeserialize

此注解用于属性或者setter方法上,用于在反序列化时可以嵌入我们自定义的代码,类似于上面的@JsonSerialize

[java] view plaincopy

  1. public class CustomDateDeserialize extends JsonDeserializer<Date> {
  2. private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  3. @Override

  4. public Date deserialize(JsonParser jp, DeserializationContext ctxt)

  5. throws IOException, JsonProcessingException {
  6. Date date = null;

  7. try {

  8. date = sdf.parse(jp.getText());

  9. } catch (ParseException e) {

  10. e.printStackTrace();

  11. }

  12. return date;

  13. }

  14. }

  • 完整例子

[java] view plaincopy

  1. //表示序列化时忽略的属性

  2. @JsonIgnoreProperties(value = { "word" })

  3. public class Person {

  4. private String name;

  5. private int age;

  6. private boolean sex;

  7. private Date birthday;

  8. private String word;

  9. private double salary;
  10. public String getName() {

  11. return name;

  12. }
  13. public void setName(String name) {

  14. this.name = name;

  15. }
  16. public int getAge() {

  17. return age;

  18. }
  19. public void setAge(int age) {

  20. this.age = age;

  21. }
  22. public boolean isSex() {

  23. return sex;

  24. }
  25. public void setSex(boolean sex) {

  26. this.sex = sex;

  27. }
  28. public Date getBirthday() {

  29. return birthday;

  30. }
  31. // 反序列化一个固定格式的Date

  32. @JsonDeserialize(using = CustomDateDeserialize.class)

  33. public void setBirthday(Date birthday) {

  34. this.birthday = birthday;

  35. }
  36. public String getWord() {

  37. return word;

  38. }
  39. public void setWord(String word) {

  40. this.word = word;

  41. }
  42. // 序列化指定格式的double格式

  43. @JsonSerialize(using = CustomDoubleSerialize.class)

  44. public double getSalary() {

  45. return salary;

  46. }
  47. public void setSalary(double salary) {

  48. this.salary = salary;

  49. }
  50. public Person(String name, int age) {

  51. this.name = name;

  52. this.age = age;

  53. }
  54. public Person(String name, int age, boolean sex, Date birthday,

  55. String word, double salary) {

  56. super();

  57. this.name = name;

  58. this.age = age;

  59. this.sex = sex;

  60. this.birthday = birthday;

  61. this.word = word;

  62. this.salary = salary;

  63. }
  64. public Person() {

  65. }
  66. @Override

  67. public String toString() {

  68. return "Person [name=" + name + ", age=" + age + ", sex=" + sex

  69. + ", birthday=" + birthday + ", word=" + word + ", salary="

  70. + salary + "]";

  71. }
  72. }

[java] view plaincopy

    1. public class Demo {

    2. public static void main(String[] args) {
    3. writeJsonObject();
    4. // readJsonObject();

    5. }
    6. // 直接写入一个对象(所谓序列化)

    7. public static void writeJsonObject() {

    8. ObjectMapper mapper = new ObjectMapper();

    9. Person person = new Person("nomouse", 25, true, new Date(), "程序员",

    10. 2500.0);

    11. try {

    12. mapper.writeValue(new File("c:/person.json"), person);

    13. } catch (JsonGenerationException e) {

    14. e.printStackTrace();

    15. } catch (JsonMappingException e) {

    16. e.printStackTrace();

    17. } catch (IOException e) {

    18. e.printStackTrace();

    19. }

    20. }
    21. // 直接将一个json转化为对象(所谓反序列化)

    22. public static void readJsonObject() {

    23. ObjectMapper mapper = new ObjectMapper();
    24. try {

    25. Person person = mapper.readValue(new File("c:/person.json"),

    26. Person.class);

    27. System.out.println(person.toString());

    28. } catch (JsonParseException e) {

    29. e.printStackTrace();

    30. } catch (JsonMappingException e) {

    31. e.printStackTrace();

    32. } catch (IOException e) {

    33. e.printStackTrace();

    34. }

    35. }
    36. }
    37. 如果Entity中的延迟加载对象必须有值,可以用Hibernate.initialize把延迟加载的对象提前获取

    38. Hibernate.initialize( Entity.getXX()
      );

Entity中Lazy Load的属性序列化JSON时报错,布布扣,bubuko.com

时间: 2024-10-10 07:36:45

Entity中Lazy Load的属性序列化JSON时报错的相关文章

SpringMVC在使用JSON时报错信息为:Content type &#39;application/json;charset=UTF-8&#39; not supported

直接原因是:我的(maven)项目parent父工程pom.xml缺少必要的三个jar包依赖坐标. 解决方法是:在web子模块的pom.xml里面添加springMVC使用JSON实现AJAX请求. <!--spring mvc-json依赖--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifact

mvc EF框架中,加载外键对象序列化对象时报错 序列化类型为XX的对象时检测到循环引用

Newtonsoft.Json.dll 或者通过->工具->库程序包管理工具->NuGet管理包->联机 输入Newtonsoft或者json.net Newtonsoft.Json是可以的: context.Response.ContentType = "text/plain"; BooksService service = new BooksService(); List<Books> list=service.GetAll().Take(5).

vue2.0动态绑定图片src属性值初始化时报错

在vue2.0中,经常会使用类似这样的语法 v-bind:src = " imgUrl "(缩写 :src = " imgUrl "),看一个案例 <template> <div> <img :src="imgUrl"> </div> </template> <script> export default { data(){ return { captcha_id: &quo

Spring中的一个错误:使用Resources时报错(The annotation @Resources is disallowed for this location)

在学习Spring的过程中遇到一个错误:在使用注解@resources的时候提示:The annotation @Resources is disallowed for this location 后来来在学问Java网友的时候解决了. 原来的代码是这样的: 1 package com.show.biz; 2 3 import javax.annotation.Resources; 4 5 import com.show.biz.UserBiz; 6 import com.show.dao.Us

pytorch中使用多显卡训练以及训练时报错:expect more than 1 value per channel when training, got input size..

pytorch在训练中使用多卡: conf.device = torch.device('cuda:0' if torch.cuda.is_available() else "cpu") conf.device_ids = list(conf.device_ids) self.model = torch.nn.DataParallel(self.model, device_ids=conf.device_ids) self.model.to(conf.device) 然后在训练的命令行

如何修改WAMP中mysql默认空密码 以及修改时报错的处理方法

WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空,所以直接按回车. 然后输入“use mysql”,意思是使用mysql这个数据库,提示“Database changed”就行. 然后输入要修改的密码的sql语句“update user set password=PASSWORD('hooray') where user='root';”,注意,sql语句结尾的

python中json库中的load、loads、dump、dumps的区别与用法

一.json.dumps(i): json中的dumps方法是用来将特定格式的数据进行字符串化的操作,比如列表字典都可以进行字符串化操作然后写入json的file:而且如果是要写入json文件就必须要进行dumps操作: 二.json.dump(): 和dumps差一个s,功能作用大致上是一样,也是讲数据转换成str格式,最终包括了讲数据写入json文件的一个操作步骤,json.dump(data, file-open,ascii=False),可以包含三个属性,第三个ascii是用来避免出现u

Python基础(12)_python模块之sys模块、logging模块、序列化json模块、pickle模块、shelve模块

5.sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 5.1 使用sys.argv进行登录判断,跳过 i/o阻塞 #使用sys.argv进行登录判断,跳过 i/o阻塞 import s

Lazy Load, 延迟加载图片的 jQuery 插件 - NeoEase

body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;