无法通过将 Mongock 与 Spring boot 一起使用来建立模型之间的关系

问题描述

我正在尝试使用 Mongock 在 Spring Boot 中开发 2 个类之间的关系,但无法在这些类之间创建 OnetoMany 关系。

我使用 @DBRef 来建立关系

Category.Java

package com.test.model;

import java.util.List;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.DBRef;
import org.springframework.data.mongodb.core.mapping.Document;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document("category")
public class Category {
    
    @Id
    private Integer id;
    private String name; 
    
    @DBRef
    private List<Requirement> requirements ;    
}

Requirements.java

package com.test.model;


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

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@NoArgsConstructor
@AllArgsConstructor
@Document("requirements")
public class Requirement {

    @Id
    private int Id;
    
    private String subcls;
    
    private String standard;

}

为了将数据存储在MongoDB中,我使用了以下配置类

DatabaseChangeLog.java

package com.test.config;

import org.bson.Document;

import com.github.cloudyrock.mongock.ChangeLog;
import com.github.cloudyrock.mongock.ChangeSet;
import com.github.cloudyrock.mongock.driver.mongodb.springdata.v3.decorator.impl.MongockTemplate;
import com.mongodb.client.MongoCollection;

import com.test.config.Migration;

@ChangeLog
public class DatabaseChangeLog {

    @ChangeSet(order="001",id="seedDatabase",author="testuser")
    public void seedDatabase(MongockTemplate db) {
        
        MongoCollection<Document> mycollection = db.getCollection("category");

        for(String json : Migration.Category) {
            mycollection.insertOne(Document.parse(json));
        }
    }
    
    
    @ChangeSet(order="002",id="seedDatabase2",author="testuser")
    public void seedDatabaseRequirement(MongockTemplate db) {
        
        
        MongoCollection<Document> mycollection = db.getCollection("requirements");

        for(String json : Migration.Requirements) {
            System.out.println(json);
            mycollection.insertOne(Document.parse(json));
        }
        
   }
}

Migration.java

package com.test.config;

public class Migration {
    
    public static final String[] Category = {
            "{'_id': 1,'name':'Data Migration'}","{'_id': 2,'name':'Data Recovery'}"
    };

    public static final String[] Requirements = {
             "{'_id': 1,'subcls': 'sub-class DM','standard' : 'DM_Standard','category': {'$ref': 'category','$id': 1}}","{'_id': 3,'subcls': 'sub-class DR','standard' : 'DR_Standard','$id': 2}}"
    };
}

application.properties

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=testdb

mongock.change-logs-scan-package=com.test.config

从上面的代码我可以创建数据库及其集合,即类别和要求

问题是当我尝试在包装类的帮助下调用 @RestController 时。我想从 API 中获取类别数据以及相应的需求数据。

CategoryController.java 包com.test.controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.test.model.Category;
import com.test.model.Requirement;
import com.test.CategoryRepository;

@RestController
@RequestMapping("/api")
public class CategoryController {
    
    @Autowired
    private CategoryRepository catRepo;
    
    @GetMapping(value="/categories",produces={"application/json"})
    public Iterable<CategoryGet> getAllCategories() {
        
        Iterable<Category> categories =  catRepo.findAll();
        
        List<CategoryGet> gets = new ArrayList<CategoryGet>();

        for(Category category: categories) {
            gets.add( new CategoryGet(category) );
        }
        
        return gets;
    }
}

包装类

类别获取

package com.test.controller;

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

import com.test.model.Category;
import com.test.model.Requirement;

public class CategoryGet implements java.io.Serializable {

    private int id;
    private String name;
    private List<RequirementGet> requirements = new ArrayList<RequirementGet>();

    public CategoryGet() {

    }

    public CategoryGet(Category cat) {
        this.name = cat.getName();
        for(Requirement req: cat.getRequirements()) {
            this.requirements.add(new RequirementGet(req));
        }
    }

    public String getName() {
        return name;
    }
    
    public List<RequirementGet> getRequirements() {
        return requirements;
    }

}

RequirementGet.java

package com.test.controller;

import com.test.model.Requirement;

public class RequirementGet implements java.io.Serializable{

    private int id;
    
    private String subcls;
    
    private String standard;
    
    private String category;
    
    public RequirementGet() {}

    public RequirementGet(Requirement req) {
        super();
        this.id = req.getId();
        this.subcls = req.getSubcls();
        this.standard = req.getStandard();
    }

    public int getId() {
        return id;
    }

    public String getSubcls() {
        return subcls;
    }

    public String getStandard() {
        return standard;
    }   
}

按照我收到的错误

enter image description here

相应类别的要求为空。

如果需要任何其他信息,请告诉我。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...