问题描述
我正在尝试使用 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;
}
}
按照我收到的错误
相应类别的要求为空。
如果需要任何其他信息,请告诉我。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)