{"record":{"id":"acc1522930ce90ca","repo":"halo-dev/halo","slug":"provider-resource-path-must-be-a-string","errorCode":null,"errorMessage":"Provider resource path must be a string","messagePattern":"Provider resource path must be a string","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java","lineNumber":235,"sourceCode":"            throw new IllegalArgumentException(\"Provider manifest must be an object\");\n        }\n        var fields = new HashSet<String>();\n        fields.addAll(manifest.propertyNames());\n        if (!fields.containsAll(Set.of(\"format\", \"entry\"))\n                || !Set.of(\"format\", \"entry\", \"style\").containsAll(fields)) {\n            throw new IllegalArgumentException(\"Provider manifest must contain format, entry, and optional style only\");\n        }\n        if (!\"esm\".equals(manifest.path(\"format\").textValue())) {\n            throw new IllegalArgumentException(\"Provider manifest format must be esm\");\n        }\n        var entry = validateManifestResource(candidate, manifest.path(\"entry\"));\n        var style = manifest.has(\"style\") ? validateManifestResource(candidate, manifest.path(\"style\")) : null;\n        return new ProviderManifest(entry, style);\n    }\n\n    private String validateManifestResource(ProviderCandidate candidate, JsonNode value) {\n        if (!value.isTextual()) {\n            throw new IllegalArgumentException(\"Provider resource path must be a string\");\n        }\n        var resourcePath = normalizeResourcePath(value.textValue());\n        var resource = providerResource(candidate, resourcePath);\n        if (resource == null || !resource.isReadable()) {\n            throw new IllegalArgumentException(\n                    \"Provider resource does not exist inside its root: \" + value.textValue());\n        }\n        return resourcePath;\n    }\n\n    private static String normalizeResourcePath(String resourcePath) {\n        if (!StringUtils.hasText(resourcePath)) {\n            throw new IllegalArgumentException(\"Provider resource path must not be blank\");\n        }\n        var normalizedSlashes = resourcePath.replace('\\\\', '/');\n        if (normalizedSlashes.startsWith(\"/\")\n                || normalizedSlashes.startsWith(\"//\")\n                || normalizedSlashes.contains(\"?\")","sourceCodeStart":217,"sourceCodeEnd":253,"githubUrl":"https://github.com/halo-dev/halo/blob/d2f5165f9c8f055ffcb3fa9c3f4032821a7b68c8/application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java#L217-L253","documentation":"Error \"Provider resource path must be a string\" thrown in halo-dev/halo.","triggerScenarios":"Thrown at application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java:235 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure the 'entry' (and 'style', if present) values in the provider manifest are strings.","Rebuild the plugin bundle so the manifest is serialized with correct types.","Check for manual manifest edits that introduced non-string values (objects, arrays, numbers)."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"d2f5165f9c8f055ffcb3fa9c3f4032821a7b68c8","analyzedAt":"2026-08-14T00:18:38.915Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}