mongodb: не удалось создать экземпляр com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl. Бин, созданный методом фабрики
Я создал приложение с помощью Springboot+ MongoDB. У меня есть класс Test, который имеет переменную экземпляра длительность класса "javax.xml.datatype.Duration". Длительность - абстрактный класс. Я могу сохранить данные, используя запрос на отдых. Но когда я получаю сохраненные данные из БД, используя запрос get, получаю следующую ошибку.
{
"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"
}
Как вы можете видеть, монго сопоставляется с экземпляром класса длительности "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;
}
}
1 ответ
Использование концепции упс Я расширил класс 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 удаленное поле продолжительности, идущее в БД. вычисляемая durationString = duration.toString на лету. Использование свойства @JsonIgnore игнорировало поле длительности, а использование @JsonProperty("duration") возвращало тот же ответ, который пользователь получил ранее.
- Проблема с парсингом БД решена.
- Пользователь получит тот же JSON, что и раньше.