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

时间:2025-03-17 08:11:23

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

这个问题也算是折腾了好久,网上找了好多都基本没啥卵用,这个方法可能效率啥的不太好,但问题也算解决了

目录

  • DubboJPA查询复杂对象报错javautilSet cannot be assigned from null
      • 目录
    • 问题描述
    • 解决方案

问题描述

在使用jpa查询又关联关系的对象(one to many等),返回的实体带有LIST,SET,MAP等如下所示:

@ManyToMany(cascade=,fetch=)
    @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=,fetch=)
    @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 = , mappedBy = "activityEntity")
    private ActivityGrantRule activityGrantRule;

provider查询出来的对象为PersistentCollection的实现,被fastjson序列化后传递到consumer后,dubbo默认的反序列化工具为hessian2,由于hessian2的局限性,反序列化PersistentCollection报错:

: 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处修改,先使用(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;
    }
原创文章,转载请注明出处