Java Morphia-CodeConfigurationException:Can';找不到类的编解码器-但类已注册

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

我遇到了一个我还没有面对的问题。 我想使用Morphia在MongoDB中存储一个带有嵌入对象的对象

它似乎完全理解如何反序列化顶级类,而不是嵌入式类。以下是两个类:

@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;