Java MongoDB не отображает расширенные классыJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java MongoDB не отображает расширенные классы

Сообщение Anonymous »

У меня есть базовый класс Person и два класса, наследуемых от него. Когда я вставляю экземпляры этих классов в базу данных, она сохраняет всю информацию о расширенных классах, как показано ниже.
Ниже приведена конфигурация mongo, код, используемый для вставки, получения и удаления документы, а также классы, с которыми я пытаюсь сопоставить.
people.json:

Код: Выделить всё

[
{
"_id": "d54d1113-2e00-46ef-8128-c6bc42220a6f",
"name": "Jo",
"_class": "person"
},
{
"_id": "3187d2a6-08da-4055-9080-2bfb7481a4a2",
"name": "Josh",
"jobTitle": "Manager",
"_class": "employee"
},
{
"_id": "80c25ae9-a402-469c-9873-5c093e093733",
"name": "John",
"major": "Art",
"_class": "student"
},
]
Однако, когда я извлекаю документы из базы данных, они сопоставляются только с базовым классом Person, теряя основной и < полеstrong>jobTitle. Я попробовал добавить псевдоним типа в классы, но это ничего не изменило.
MongoConfig.java:

Код: Выделить всё

package com.example.demo;

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration;

@Configuration
public class MongoConfig extends AbstractMongoClientConfiguration {

@Override
protected String getDatabaseName() {
return "test";
}

@Override
public MongoClient mongoClient() {
ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/example");
MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.build();

return MongoClients.create(mongoClientSettings);
}

}
Test.java:

Код: Выделить всё

package com.example.demo;

import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class Test {

@Autowired
MongoConfig config;

MongoTemplate template;

String collection = "people";

private void insertData() {
List
 peopleList = new ArrayList();
peopleList.add(new Person("Jo"));
peopleList.add(new Employee("Josh", "Manager"));
peopleList.add(new Student("John","Art"));

MongoTemplate template = new MongoTemplate(config.mongoClient(), "test");
if (template.count(new Query(), collection) == 0) {
template.insert(peopleList, collection);
}

}

@PostConstruct
public void doStuff() {

template = new MongoTemplate(config.mongoClient(), "test");
insertData();
List people = template.find(new Query(), Person.class,collection);
template.find(new Query(), Person.class,collection);
for (Person person : people) {
System.out.println(person);
}

template.remove(new Query(),Person.class,collection);
}
}
Person.java:

Код: Выделить всё

package com.example.demo;

import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.UUID;

@TypeAlias("person")
@Document(collection = "person")
public class Person {
String id;
String name;

public Person() {
}

public Person(String name) {
this.id = UUID.randomUUID().toString();
this.name = name;

}

public String getName() {
return name;
}

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

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

@Override
public String toString() {
return "Person{" +
"id='" + id + '\'' +
", name='"  + name + '\'' +
'}';
}
}
Employee.java:

Код: Выделить всё

package com.example.demo;

import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.mongodb.core.mapping.Document;

@TypeAlias("employee")
@Document(collection = "person")
public class Employee extends Person{
String jobTitle;

public Employee(){

}

public Employee(String jobTitle) {
this.jobTitle = jobTitle;
}

public Employee(String name, String jobTitle) {
super(name);
this.jobTitle = jobTitle;
}

public String getJobTitle() {
return jobTitle;
}

public void setJobTitle(String jobTitle) {
this.jobTitle = jobTitle;
}

@Override
public String toString() {
return "Employee{" +
"jobTitle='" + jobTitle + '\'' +
", id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
Student.java:

Код: Выделить всё

package com.example.demo;

import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.mongodb.core.mapping.Document;

@TypeAlias("student")
@Document(collection = "person")
public class Student extends Person {
String major;

public Student(String name, String major) {
super(name);
this.major = major;
}

public String getMajor() {
return major;
}

public void setMajor(String major) {
this.major = major;
}

@Override
public String toString() {
return "Student{" +
"major='" + major + '\'' +
", id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
РЕДАКТИРОВАТЬ
Заметил, что я указал неправильный класс для Test.java. Исправлено, чтобы люди могли видеть тест.

Подробнее здесь: https://stackoverflow.com/questions/787 ... ed-classes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»