Java Morphia-CodeConfigurationException:Can';找不到类的编解码器-但类已注册
我遇到了一个我还没有面对的问题。 我想使用Morphia在MongoDB中存储一个带有嵌入对象的对象 它似乎完全理解如何反序列化顶级类,而不是嵌入式类。以下是两个类:Java Morphia-CodeConfigurationException:Can';找不到类的编解码器-但类已注册,java,mongodb,codec,bson,morphia,Java,Mongodb,Codec,Bson,Morphia,我遇到了一个我还没有面对的问题。 我想使用Morphia在MongoDB中存储一个带有嵌入对象的对象 它似乎完全理解如何反序列化顶级类,而不是嵌入式类。以下是两个类: @Entity(value = "cb-homes", noClassnameStored = true) @Getter @Setter @ToString public class DatastoreHome extends DatastoreEntity { @Id private Ob
@Entity(value = "cb-homes", noClassnameStored = true)
@Getter
@Setter
@ToString
public class DatastoreHome extends DatastoreEntity {
@Id
private ObjectId id;
@Indexed(options = @IndexOptions(unique = true, sparse = true, background = true))
private UUID uniqueId;
@Property("homes")
@Embedded
private Map<String, List<HomeLocation>> homeLocations;
public List<String> getHomeNameList() {
List<HomeLocation> locations = homeLocations.get(Bukkit.getServerName());
if(locations == null) {
locations = new ArrayList<>();
homeLocations.put(Bukkit.getServerName(), locations);
}
return locations.stream().map(HomeLocation::getHomeName).collect(Collectors.toList());
}
public List<Location> getHomeLocationList() {
List<HomeLocation> locations = homeLocations.get(Bukkit.getServerName());
if(locations == null) {
locations = new ArrayList<>();
homeLocations.put(Bukkit.getServerName(), locations);
}
return locations.stream().map(HomeLocation::getLocation).collect(Collectors.toList());
}
public boolean hasSetBaseHome() {
return getHomeLocation("home") != null;
}
public Location getBaseHomeLocation() {
return getHomeLocation("home");
}
public Location getHomeLocation(String homeName) {
List<HomeLocation> locations = homeLocations.get(Bukkit.getServerName());
if(locations == null) {
locations = new ArrayList<>();
homeLocations.put(Bukkit.getServerName(), locations);
}
return locations.stream()
.filter(location -> location.getHomeName().equals(homeName.toLowerCase()))
.findAny()
.map(HomeLocation::getLocation)
.filter(location -> location.getWorld().getName() != "world")
.orElse(null);
}
public boolean isHomeAlreadySet(String name) {
return getHomeNameList().contains(name.toLowerCase());
}
public HomeLocation addHomeLocation(String homeName, Location location) {
List<HomeLocation> locations = homeLocations.get(Bukkit.getServerName());
if(locations == null) {
locations = new ArrayList<>();
homeLocations.put(Bukkit.getServerName(), locations);
}
if(isHomeAlreadySet(homeName)) {
locations.remove(getHomeLocation(homeName));
}
HomeLocation homeLocation = new HomeLocation();
homeLocation.setHomeName(homeName.toLowerCase());
homeLocation.setLocation(location);
homeLocations.get(Bukkit.getServerName()).add(homeLocation);
return homeLocation;
}
public void removeBaseHomeLocation() {
removeHomeLocation("home");
addHomeLocation("home", new Location(Bukkit.getWorld("world"), 0, 0, 0, 0, 0));
}
public boolean removeHomeLocation(String homeName) {
if(homeLocations.get(Bukkit.getServerName()) == null) {
homeLocations.put(Bukkit.getServerName(), new ArrayList<>());
}
return homeLocations.get(Bukkit.getServerName()).removeIf(location -> location.getHomeName().equals(homeName));
}
static {
datastore.ensureIndexes(DatastoreHome.class);
}
}
正如您所见,这两个类都是通过静态类初始化添加到Morphia索引的。这适用于所有其他类,仅适用于HomeLocation.class它不起作用
你们有办法解决这个问题吗?
我还尝试在初始化Morphia时手动将类添加到Morphia索引中,但这也不起作用
我希望你能帮助我
亲切问候,
费边·施密特(Fabian Schmidt)我知道这是一篇老文章,但分享我的解决方案,我希望能帮助其他人 在您的情况下,您应该更改以下内容:
@Property("homes")
@Embedded
private Map<String, List<HomeLocation>> homeLocations;
@Property(“homes”)
@嵌入
私人地图主页位置;
为此:
@Embedded("homes")
private Map<String, List<HomeLocation>> homeLocations;
@嵌入式(“家庭”)
私人地图主页位置;
并且无需在HomeLocation类的顶部添加@Embedded注释。您是否收到任何错误消息?此外,嵌入对象中不需要@Id,因为它只在集合DatastoreHome对象的字段中表示。您是否在类中使用Lombok注释?不确定这是否在Morphia上测试过。Lombok在Morphia上运行得非常好,我们在其他所有类中也使用它。问题是,Morphia没有使用MongoDB的en/解码器,它有自己的。正因为如此,Morphia不知道如何映射文档类,所以失败了。我通过手动连接到BSON.class并添加en/解码器找到了解决方法。不幸的是,这个问题没有被提及,所以花了三天时间才解决。
@Embedded("homes")
private Map<String, List<HomeLocation>> homeLocations;