Помогите Странная проблема с инициализацией конфига.

Bezobrazie

Активный участник
Пользователь
Баллы
46
Имя в Minecraft
MySoulIsCry
Создаю и инициализирую конфиг таким образом.
PHP:
private File partyDataFile = new File(getDataFolder() + File.separator + "data" + File.separator + "partyData.yml");
private FileConfiguration partyDataConfig = YamlConfiguration.loadConfiguration(partyDataFile);
При 1 инициализации все ок конфиг создается после чего я его наполняю для теста.
Но при 2 запуске плагина когда файл уже существует вылетает ошибка.
Вылетает она на private FileConfiguration partyDataConfig = YamlConfiguration.loadConfiguration(partyDataFile);
Не могу понять в чем проблема ведь на более старых версиях таких как 1 12 2 или 1 16 5 это все работало нормально а тут нет.
PHP:
[19:56:21] [Server thread/WARN]: org.bukkit.plugin.InvalidPluginException: org.yaml.snakeyaml.error.YAMLException: Could not deserialize object
[19:56:21] [Server thread/WARN]:        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:149)
[19:56:21] [Server thread/WARN]:        at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:394)
[19:56:21] [Server thread/WARN]:        at com.rylinaux.plugman.util.PluginUtil.load(PluginUtil.java:295)
[19:56:21] [Server thread/WARN]:        at com.rylinaux.plugman.command.LoadCommand.execute(LoadCommand.java:114)
[19:56:21] [Server thread/WARN]:        at com.rylinaux.plugman.PlugManCommandHandler.onCommand(PlugManCommandHandler.java:95)
[19:56:21] [Server thread/WARN]:        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45)
[19:56:21] [Server thread/WARN]:        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:149)
[19:56:21] [Server thread/WARN]:        at org.bukkit.craftbukkit.v1_18_R1.CraftServer.dispatchCommand(CraftServer.java:821)
[19:56:21] [Server thread/WARN]:        at org.bukkit.craftbukkit.v1_18_R1.CraftServer.dispatchServerCommand(CraftServer.java:806)
[19:56:21] [Server thread/WARN]:        at net.minecraft.server.dedicated.DedicatedServer.bf(DedicatedServer.java:453)
[19:56:21] [Server thread/WARN]:        at net.minecraft.server.dedicated.DedicatedServer.b(DedicatedServer.java:429)
[19:56:21] [Server thread/WARN]:        at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:1206)
[19:56:21] [Server thread/WARN]:        at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:1034)
[19:56:21] [Server thread/WARN]:        at net.minecraft.server.MinecraftServer.lambda$0(MinecraftServer.java:304)
[19:56:21] [Server thread/WARN]:        at java.base/java.lang.Thread.run(Thread.java:833)
[19:56:21] [Server thread/WARN]: Caused by: org.yaml.snakeyaml.error.YAMLException: Could not deserialize object
[19:56:21] [Server thread/WARN]:        at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:50)
[19:56:21] [Server thread/WARN]:        at org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:230)
[19:56:21] [Server thread/WARN]:        at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:220)
[19:56:21] [Server thread/WARN]:        at org.bukkit.configuration.file.YamlConstructor.construct(YamlConstructor.java:27)
[19:56:21] [Server thread/WARN]:        at org.bukkit.configuration.file.YamlConfiguration.fromNodeTree(YamlConfiguration.java:158)
[19:56:21] [Server thread/WARN]:        at org.bukkit.configuration.file.YamlConfiguration.fromNodeTree(YamlConfiguration.java:156)
[19:56:21] [Server thread/WARN]:        at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:115)
[19:56:21] [Server thread/WARN]:        at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:160)
[19:56:21] [Server thread/WARN]:        at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:128)
[19:56:21] [Server thread/WARN]:        at org.bukkit.configuration.file.YamlConfiguration.loadConfiguration(YamlConfiguration.java:304)
[19:56:21] [Server thread/WARN]:        at com.dsparty.DSParty.<init>(DSParty.java:20)
[19:56:21] [Server thread/WARN]:        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[19:56:21] [Server thread/WARN]:        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
[19:56:21] [Server thread/WARN]:        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
[19:56:21] [Server thread/WARN]:        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
[19:56:21] [Server thread/WARN]:        at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128)
[19:56:21] [Server thread/WARN]:        at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347)
[19:56:21] [Server thread/WARN]:        at java.base/java.lang.Class.newInstance(Class.java:645)
[19:56:21] [Server thread/WARN]:        at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:79)
[19:56:21] [Server thread/WARN]:        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:145)
[19:56:21] [Server thread/WARN]:        ... 14 more
[19:56:21] [Server thread/WARN]: Caused by: java.lang.IllegalArgumentException: Specified class does not exist ('com.dsparty.party.Party')
[19:56:21] [Server thread/WARN]:        at org.bukkit.configuration.serialization.ConfigurationSerialization.deserializeObject(ConfigurationSerialization.java:197)
[19:56:21] [Server thread/WARN]:        at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:48)
[19:56:21] [Server thread/WARN]:        ... 33 more

PHP:
if (!partyDataFile.exists()) {
    try {
        partyDataConfig.save(partyDataFile);
    } catch (IOException e) {
        logger.warning("Failed to create partyData.yml file");
    }
}
Создание набора данных для теста:
PHP:
PartyDataManager partyDataManager = new PartyDataManager(this, partyDataConfig, partyDataFile);
ArrayList<Party> parties = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    Party party = new Party(Math.random()+ "");
    party.setHome(new Location(Bukkit.getWorld(""), 1, 2, 3));
    ArrayList<String> arrayList = new ArrayList<String>();
    arrayList.add("123123123");
    arrayList.add("123123123");
    arrayList.add("123123123");
    arrayList.add("123123123");
    party.setMembersUUID(arrayList);
    parties.add(party);
}
partyDataManager.saveParties(parties);

Сохранение в конфиг:
PHP:
public void saveParties(ArrayList<Party> parties){
    for(Party party : parties){
        partyData.set(party.getOwnerUUID(), party);
    }
    try {
        partyData.save(partyFile);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

pojo class Party:

PHP:
public class Party implements ConfigurationSerializable {

    private String ownerUUID;
    private ArrayList<String> membersUUID;
    transient private Location home;

    public Party(String ownerUUID) {
        this.ownerUUID = ownerUUID;
    }

    public String getOwnerUUID() {
        return ownerUUID;
    }

    public void setOwnerUUID(String ownerUUID) {
        this.ownerUUID = ownerUUID;
    }

    public ArrayList<String> getMembersUUID() {
        return membersUUID;
    }

    public void setMembersUUID(ArrayList<String> membersUUID) {
        this.membersUUID = membersUUID;
    }

    public Location getHome() {
        return home;
    }

    public void setHome(Location home) {
        this.home = home;
    }

    @Override
    public String toString(){
        StringBuilder stringBuilder = new StringBuilder();

        stringBuilder.append("Owner: " + ownerUUID);
        stringBuilder.append("\nMembers: ");
        for(String s : membersUUID){
            stringBuilder.append("/n  - " + s);
        }

        stringBuilder.append("Location: x:" + home.getX() + " y: " + home.getY() + " z: " + home.getBlockZ());
        return stringBuilder.toString();
    }

    @Override
    public Map<String, Object> serialize() {
        Map<String, Object> map = new HashMap<>();
        map.put("Owner", ownerUUID);
        map.put("Members", membersUUID);
        map.put("Home", home);
        return map;
    }
}
 
Научитесь читать документацию, пожалуйста.
Код:
new File(getDataFolder(), "data" + File.separator + "partyData.yml");
Твой класс Party не имеет статического метода deserialize(Map), класс Party скорее всего не зарегистрирован как ConfigurationSerializable.

Ну и если уж на то пошло, то можешь использовать json (Gson) для хранения таких данных.
 
Пытаюсь переопределить метод но его просто нет в ConfigurationSerializable
https://papermc.io/javadocs/paper/1.../serialization/ConfigurationSerializable.html
не зарегистрирован как ConfigurationSerializable
Вообще-то зареган ConfigurationSerialization.registerClass(Party.class);
new File(getDataFolder(), "data" + File.separator + "partyData.yml");
Убрал лишний File.separator создалась папка
upload_2022-1-26_20-31-38.png
Разобрался в чем проблема нужно регистрировать класс раньше чем инициализировать конфиг с данными этого класса ConfigurationSerialization.registerClass(Party.class);
 
Пытаюсь переопределить метод но его просто нет в ConfigurationSerializable
https://papermc.io/javadocs/paper/1.../serialization/ConfigurationSerializable.html
Потому что он статический, лол. Тебе это даже английским на белом написано
These objects MUST implement one of the following, in addition to the methods as defined by this interface:
  • A static method "deserialize" that accepts a single Map< String, Object> and returns the class.
 
Ну реализовал я его
PHP:
public static Party deserialize(Map<String, Object> map){
    Party party = new Party(map.get("Owner").toString());
    if(map.containsKey("Members")){
        party.setMembersUUID((ArrayList<String>) map.get("Members"));
    }
    if(map.containsKey("Home")){
        party.setHome((Location) map.get("Home"));
    }
    return party;
}
Все равно при попытке десериализации возвращает null
PHP:
public ArrayList<Party> getAllSaveParty(){
    ArrayList<Party> parties = new ArrayList<>();
    for(String path : partyData.getConfigurationSection("parties").getKeys(false)){
        Party party = partyData.getObject(path, Party.class);
        parties.add(party);
    }
    return parties;
}
и почемуто при записи объектов оно записывает еще и в '0' хотя я его нигде не указывал
upload_2022-1-26_20-51-26.png
 
Назад
Верх