Dubbo+JPA查询复杂对象报错:java.util.Set cannot be assigned from null
2017-12-27 16:08
453 查看
Dubbo+JPA查询复杂对象报错:java.util.Set cannot be assigned from null
这个问题也算是折腾了好久,网上找了好多都基本没啥卵用,这个方法可能效率啥的不太好,但问题也算解决了
目录
DubboJPA查询复杂对象报错javautilSet cannot be assigned from null目录
问题描述
解决方案
问题描述
在使用jpa查询又关联关系的对象(one to many等),返回的实体带有LIST,SET,MAP等如下所示:@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) @JoinTable(name="ACTIVITY_OFFER_CHANNEL",joinColumns={@JoinColumn(name="ACTIVITY_ID")}, inverseJoinColumns={@JoinColumn(name="CHANNEL_ID")}) @JsonIgnore private Set<OfferChannel> offerChannels= new HashSet<OfferChannel>(); //发放途径 (1:链接领取_2:发放到账户 3:发放到LIST 4:使用优惠码) @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) @JoinTable(name="ACTIVITY_GRANT_WAY",joinColumns={@JoinColumn(name="ACTIVITY_ID")}, inverseJoinColumns={@JoinColumn(name="WAY_ID")}) @JsonIgnore private Set<GrantWayEntity> grantWays= new HashSet<GrantWayEntity>(); //是否发放规则(1:是,0:否) @Column(name = "Grant_Rule_Type", columnDefinition = ("varchar(300) default null comment '是否发放规则 '")) private String grantRuleType; //活动所对应的发放规则(一对一,即一个活动只能对应一个规则,一个规则只能归属一个活动) @OneToOne(optional=true, cascade = CascadeType.ALL, mappedBy = "activityEntity") private ActivityGrantRule activityGrantRule;
provider查询出来的对象为PersistentCollection的实现,被fastjson序列化后传递到consumer后,dubbo默认的反序列化工具为hessian2,由于hessian2的局限性,反序列化PersistentCollection报错:
com.alibaba.com.caucho.hessian.io.HessianFieldException: com.kmair.couponapi.entity.result.CouponEntity.couponCodes: java.util.Set cannot be assigned from null at com.alibaba.com.caucho.hessian.io.JavaDeserializer.logDeserializeError(JavaDeserializer.java:677) at com.alibaba.com.caucho.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:400) at com.alibaba.com.caucho.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:233) at com.alibaba.com.caucho.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:157) at com.alibaba.com.caucho.hessian.io.SerializerFactory.readObject(SerializerFactory.java:397) 。 。 。 Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection, could not initialize proxy - no Session at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:587) at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:204)
解决方案
在consumer处修改,先使用com.alibaba.fastjson.JSON.toJSONString(Object)将返回的对象序列化为json,再将json反序列化回去,这个时候对象就已经不是PersistentCollection的实现,consumer再消费时也能正常反序列化了,如下:@Action(name = "活动查询接口",type="查询") public List<ActivityEntity> findAllActivity() { Criteria<ActivityEntity> criteria = new Criteria<ActivityEntity>(); criteria.add(Restrictions.eq("auditFlag", "2", false));//审核状态 criteria.add(Restrictions.eq("activityStatus", "1", false));//活动状态 criteria.add(Restrictions.eq("status", "1", false));//状态 criteria.add(Restrictions.lte("activityEndTime", new Date(), false)); //活动结束时间大于当前时间 criteria.add(Restrictions.gte("activityStartTime", new Date(), true)); //活动开始时间 List<ActivityEntity> entities = activityDAO.findAll(criteria); //先序列化 String json = JSON.toJSONString(entities); //再转为对象 List<ActivityEntity> activityEntities = JSON.parseArray(json, ActivityEntity.class); return activityEntities; }
原创文章,转载请注明出处
相关文章推荐
- The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class fi
- The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class fi
- The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class fi
- 解决jdk8之The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .
- The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class fi
- SSH整合时执行hibernate查询报错:java.lang.ClassCastException: com.ch.hibernate.Department_$$_javassist_0 cannot be cast to javassist.util.proxy
- 【ActiveMQ】管理界面查看消息详情,报错/WEB-INF/tags/form/forEachMapEntry.tag PWC6199: Generated servlet error: The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files
- The type java.util.Optional cannot be resolved. It is indirectly referenced from required .class....
- 错误:Property of 'java.util.Set<?>' type cannot be injected by 'List'的解决方案
- The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files
- 无法从带有索引像素格式的图像创建graphics对象|A Graphics object cannot be created from an image that has an indexed pixel format
- The type java.util.Map$Entry cannot be resolved问题的解决
- The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class
- java.lang.IllegalArgumentException: node to traverse cannot be null!
- 在eclipse使用到json时出现The type java.lang.Object cannot be resolved. It is indirectly referenced from req
- java.lang.IllegalArgumentException: node to traverse cannot be null!
- eclipse加载别人的工程时提示the import java.util cannot be resolve时解决方式
- java.util.LinkedHashMap cannot be cast to com.wisely.entity.User
- The import java.util cannot be resolved问题
- java.lang.IllegalArgumentException: node to traverse cannot be null!