{"record":{"id":"9bdb1f21eed79590","repo":"apache/pulsar","slug":"entry-filter-name-does-not-provide-a-entry-fi","errorCode":null,"errorMessage":"Entry filter `${name}` does NOT provide a entry filters implementation","messagePattern":"Entry filter `(.+?)` does NOT provide a entry filters implementation","errorType":"exception","errorClass":"java.lang.RuntimeException","httpStatus":null,"severity":"error","filePath":"pulsar-broker/src/main/java/org/apache/pulsar/broker/service/plugin/EntryFilterProvider.java","lineNumber":191,"sourceCode":"        String configStr;\n\n        try {\n            configStr = ncl.getServiceDefinition(ENTRY_FILTER_DEFINITION_FILE + \".yaml\");\n        } catch (NoSuchFileException e) {\n            configStr = ncl.getServiceDefinition(ENTRY_FILTER_DEFINITION_FILE + \".yml\");\n        }\n\n        return ObjectMapperFactory.getYamlMapper().reader().readValue(\n                configStr, EntryFilterDefinition.class\n        );\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    protected EntryFilter load(EntryFilterMetaData metadata)\n            throws IOException {\n        final EntryFilterDefinition def = metadata.getDefinition();\n        if (StringUtils.isBlank(def.getEntryFilterClass())) {\n            throw new RuntimeException(\"Entry filter `\" + def.getName() + \"` does NOT provide a entry\"\n                    + \" filters implementation\");\n        }\n        try {\n            final NarClassLoader ncl = getNarClassLoader(metadata.getArchivePath());\n            if (ncl == null) {\n                throw new RuntimeException(\"Entry filter `\" + def.getName() + \"` cannot be loaded, \"\n                        + \"see the broker logs for further details\");\n            }\n            Class entryFilterClass = ncl.loadClass(def.getEntryFilterClass());\n            Object filter = entryFilterClass.getDeclaredConstructor().newInstance();\n            if (!(filter instanceof EntryFilter)) {\n                throw new IOException(\"Class \" + def.getEntryFilterClass()\n                        + \" does not implement entry filter interface\");\n            }\n            EntryFilter pi = (EntryFilter) filter;\n            // the classloader is shared with the broker, the instance doesn't own it\n            return new EntryFilterWithClassLoader(pi, ncl, false);\n        } catch (Throwable e) {","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/plugin/EntryFilterProvider.java#L173-L209","documentation":"EntryFilterProvider.load turns filter metadata into a live EntryFilter instance via a NAR classloader. The filter's EntryFilterDefinition must declare entryFilterClass; if it is blank the definition is malformed and the provider cannot know which class to instantiate, so it throws.","triggerScenarios":"load() is called for a filter whose NAR's entry_filter.yml (or equivalent definition) omits or leaves empty the entryFilterClass field.","commonSituations":"Hand-written or templated filter definition file missing the class key; NAR build script packaged a default/empty definition; YAML key renamed or typo'd so it deserializes to null.","solutions":["Add the fully-qualified implementation class to entryFilterClass in the filter definition inside the NAR","Rebuild and redeploy the filter NAR","Verify the packaged definition file with: unzip -p filter.nar META-INF/.../entry_filter.yml"],"exampleFix":"// before (entry_filter.yml)\nname: audit-filter\n// after\nname: audit-filter\nentryFilterClass: com.example.filters.AuditEntryFilter","handlingStrategy":"validation","validationCode":"EntryFilterDefinition def = metaData.getDefinition();\nif (def == null || StringUtils.isBlank(def.getEntryFilterClass())) {\n    throw new IllegalStateException(\"Filter NAR definition is missing entryFilterClass\");\n}","typeGuard":"boolean hasImplementationClass(EntryFilterMetaData md) {\n    return md != null && md.getDefinition() != null && StringUtils.isNotBlank(md.getDefinition().getEntryFilterClass());\n}","tryCatchPattern":"try {\n    EntryFilter f = provider.load(metadata);\n} catch (RuntimeException e) {\n    log.error(\"Filter {} lacks implementation class in its definition\", metadata.getName(), e);\n}","preventionTips":["Always set entryFilterClass (FQCN) in the filter definition file","Verify packaged NAR contents in CI before publishing","Use a shared template for entry_filter definitions so the key is never dropped"],"tags":["pulsar","entry-filter","nar-loading","config-missing-field"],"backgroundTag":"plugin-definition-missing-class","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}