您的位置:首页 > 编程语言 > Java开发

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;
}


原创文章,转载请注明出处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jpa dubbo java
相关文章推荐