Dubbo+JPA查询复杂对象报错:java.util.Set cannot be assigned from null

Dubbo+JPA查询复杂对象报错:java.util.Set 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;
    }
原创文章,转载请注明出处
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值