【问题标题】:Getting a java runtime exception while converting a an entity using gson使用 gson 转换实体时获取 java 运行时异常
【发布时间】:2022-12-06 05:24:29
【问题描述】:

我正在尝试使用 gson 将一个对象转换为另一个对象。在转换 gson 时出现运行时异常:“无法为接口 java.sql.clob 调用无参数构造函数。为此类型向 gson 注册实例创建器可能会解决问题。”我不太确定为什么会发生此异常。下面是代码。

实体 1:

    @Entity
@Table(name="Template")
public class TemplateData implements serializable{
    @Column(name="template_id")
    public Integer templateId;
    
    @Lob
    @Column(name="template_Data")
    public Clob templateData;

    @Lob
    @Column(name="template_Total")
    public Clob templateTotal;
    
    public Integer getTemplateId(){
        return templateId;
    }
    
    public void setTemplateId(Integer templateId){
        this.templateId = templateId;
    }
    
    public Clob getTemplateData(){
        return templateData;
    }
    
    public void setTemplateId(Clob templateData){
        this.templateData = templateData;
    }
    
    public Clob getTemplateTotal(){
        return templateTotal;
    }
    
    public void setTemplateTotal(Clob templateTotal){
        this.templateTotal = templateTotal;
    }
}

实体 2-

    @Entity
@Table(name="Template_Audit")
public class TemplateAuditData implements serializable{

    @Column(name="template_Audit_id")
    public Integer templateAudtId;

    @Column(name="template_id")
    public Integer templateId;
    
    @Lob
    @Column(name="template_Data")
    public Clob templateData;

    @Lob
    @Column(name="template_Total")
    public Clob templateTotal;
    
    public Integer getTemplateAuditId(){
        return templateAudtId;
    }
    
    public void setTemplateId(Integer templateAudtId){
        this.templateAudtId = templateAudtId;
    }
    
    public Integer getTemplateId(){
        return templateId;
    }
    
    public void setTemplateId(Integer templateId){
        this.templateId = templateId;
    }
    
    public Clob getTemplateData(){
        return templateData;
    }
    
    public void setTemplateId(Clob templateData){
        this.templateData = templateData;
    }
    
    public Clob getTemplateTotal(){
        return templateTotal;
    }
    
    public void setTemplateTotal(Clob templateTotal){
        this.templateTotal = templateTotal;
    }
}

为模板数据创建一个对象,这个对象有一些数据。

TemplateData td = new TemplateData();
 

//td has some data and I am able to save the TemplateData using hibernate //trying to convert templatedata into templateauditdata

TemplateAuditData tad = new Gson().fromJson(new Gson().toJson(td), new TypeToken<TemplateAuditData>(){}.getType());

对象 'tad' 给我上面的运行时异常。

谁能帮我解决这个问题。我无法理解这个问题。 先感谢您。

【问题讨论】:

    标签: json gson jsonconvert


    【解决方案1】:

    如果 Clob 是一个接口,默认情况下 Gson 不能反序列化它,因为它不知道哪些类实现了该接口(如果有的话)以及它应该为其中的哪些类创建一个实例。这就是异常的基本含义,您必须通过 InstanceCreator 指定如何创建 Clob 的实例,或者您必须编写自定义 TypeAdapter 来执行转换。由于Clob(及其实现SerialClob)不是您自己的类,您应该选择TypeAdapter 方法,否则您(不小心)依赖于这些类的实现细节,因为 Gson 使用反射来访问它们的字段。这很可能不再适用于最新的 JDK 版本。

    但是,对于这个 toJson-fromJson 转换,也许有一个更简洁的解决方案,例如:

    • TemplateData添加一个函数,它基于它创建一个新的TemplateAuditData
    • 或者,如果可能的话使用继承使得TemplateAuditData扩展TemplateData

    【讨论】:

      猜你喜欢
      • 2016-12-27
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多