@Nullable
    public static String readPropertyAsString(
            Map<String, Object> properties,
            @Nullable String parent,
            String key,
            boolean required) {
        String value;
        try {
            value = (String) properties.get(key);
        } catch (Exception e) {
            String message = parent == null
                    ? "The value of the field \""
                            + key
                            + "\" must be a string"
                    : "The value of the field \""
                            + parent
                            + "."
                            + key
                            + "\" must be a string";
            throw new IllegalArgumentException(message, e);
        }
        if (StringUtils.hasText(value)) {
            return value;
        }
        if (required) {
            String message = parent == null
                    ? "The value of the field \""
                            + key
                            + "\" must not be blank"
                    : "The value of the field \""
                            + parent
                            + "."
                            + key
                            + "\" must not be blank";
            throw new IllegalArgumentException(message);
        }
        return null;
    }
@implNote If the plugin does not specify the compatible servers, we consider it supports all
          server types by default
turms-server-common/src/main/java/im/turms/server/common/infra/plugin/PluginDescriptorFactory.java