【问题标题】:mongodb : Failed to instantiate com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl. Bean created using factory methodmongodb:无法实例化 com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl。使用工厂方法创建的 Bean
【发布时间】:2018-06-05 10:14:00
【问题描述】:

我用springboot+mongoDB创建了一个应用。 我有一个类 Test,它的实例变量 duration 是类“javax.xml.datatype.Duration”。 Duration 是一个抽象类。 我可以使用休息请求保存数据。但是当我使用获取请求从数据库中检索保存的数据时出现以下错误。

 {
    "timestamp": "2018-06-05T09:27:28.538+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "Failed to instantiate com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl using constructor NO_CONSTRUCTOR with arguments ",
    "path": "/user/test"
}

我已经检查了数据库以获得 BSON 表示

{                                                                                                                                                                                                                                                    
  "_id" : "Arjun",
  "duration" : {
    "signum" : 1,
    "hours" : "2",                                                                                                                                                                                                                               
    "minutes" : "0",
    "seconds" : "0",
    "_class" : "com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl"
  },                                                                                                                                                                                                                                           
  "_class" : "com.runitsimple.WebshopConnectorMangoDB3.bean.Test"
}

如您所见,mongo 被映射到 duration 类实例到 "com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl"
它是一个默认范围类,我们将无法在包之外创建实例。 真的被问题困住了。请帮忙。 类在下面

public class Test {
    @Id
    private String name;
    private Duration duration;

    public Test() {
    }

    public Test(String name, Duration duration) {
        this.name = name;
        this.duration = duration;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Duration getDuration() {
        return duration;
    }

    public void setDuration(Duration duration) {
        this.duration = duration;
    }
}

【问题讨论】:

  • 持续时间使用以下工厂方法初始化。如何在 mongorepository.Duration 中映射这个 dur = DatatypeFactory.newDuration("P2DT15H45M0S");
  • 任何帮助家伙。请

标签: java mongodb spring-mongodb


【解决方案1】:

使用 oops 概念进行了修复。 我扩展了 Test 类并覆盖了持续时间字段。添加了一个新的字段 durationString。

public class Test {
@Id
private String name;
@Transient
@JsonIgnore
private Duration duration;
@JsonProperty("duration")
private Duration durationString;

public Test() {
}

public Test(String name, Duration duration) {
    this.name = name;
    this.duration = duration;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Duration getDuration() {
    return duration;
}

public void setDuration(Duration duration) {
    this.duration = duration;
}}

使用 @Transient 将持续时间字段移至 DB。即时计算 durationString = duration.toString。使用 @JsonIgnore 属性忽略了持续时间字段并使用 @JsonProperty("duration") 返回用户之前得到的相同响应。

  • 数据库解析问题已解决。
  • 用户将获得与以前相同的 JSON。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多