{"record":{"id":"f0491ddd298dc4a6","repo":"quarkusio/quarkus","slug":"classes-used-in-sseeventfilter-must-have-a-no-arg","errorCode":null,"errorMessage":"Classes used in @SseEventFilter must have a no-args constructor. Offending class is '${class}'","messagePattern":"Classes used in @SseEventFilter must have a no-args constructor\\. Offending class is '(.+?)'","errorType":"exception","errorClass":"RestClientDefinitionException","httpStatus":null,"severity":"error","filePath":"extensions/resteasy-reactive/rest-client/deployment/src/main/java/io/quarkus/rest/client/reactive/deployment/RestClientReactiveProcessor.java","lineNumber":536,"sourceCode":"        if (instances.isEmpty()) {\n            return;\n        }\n\n        List<String> filterClassNames = new ArrayList<>(instances.size());\n        for (AnnotationInstance instance : instances) {\n            if (instance.target().kind() != AnnotationTarget.Kind.METHOD) {\n                continue;\n            }\n            if (instance.value() == null) {\n                continue; // can't happen\n            }\n            Type filterType = instance.value().asClass();\n            DotName filterClassName = filterType.name();\n            ClassInfo filterClassInfo = index.getClassByName(filterClassName.toString());\n            if (filterClassInfo == null) {\n                log.warn(\"Unable to find class '\" + filterType.name() + \"' in index\");\n            } else if (!filterClassInfo.hasNoArgsConstructor()) {\n                throw new RestClientDefinitionException(\n                        \"Classes used in @SseEventFilter must have a no-args constructor. Offending class is '\"\n                                + filterClassName + \"'\");\n            } else {\n                filterClassNames.add(filterClassName.toString());\n            }\n        }\n        reflectiveClasses.produce(ReflectiveClassBuildItem.builder(filterClassNames.toArray(new String[0]))\n                .reason(getClass().getName())\n                .build());\n    }\n\n    @BuildStep\n    void determineRegisteredRestClients(\n            CombinedIndexBuildItem combinedIndexBuildItem,\n            RestClientsBuildTimeConfig clientsConfig,\n            BuildProducer<RegisteredRestClientBuildItem> producer) {\n        IndexView index = combinedIndexBuildItem.getIndex();\n        Set<DotName> seen = new HashSet<>();","sourceCodeStart":518,"sourceCodeEnd":554,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/resteasy-reactive/rest-client/deployment/src/main/java/io/quarkus/rest/client/reactive/deployment/RestClientReactiveProcessor.java#L518-L554","documentation":"Classes referenced by the `@SseEventFilter` annotation on a REST Client interface are instantiated reflectively by the runtime and therefore must have a public no-args constructor. During build, Quarkus indexes the filter class and throws RestClientDefinitionException if it lacks one.","triggerScenarios":"Annotating a client interface method with `@SseEventFilter(MyFilter.class)` where MyFilter only has parameterized constructors (e.g. a constructor taking a Logger or config).","commonSituations":"Reusing a JAX-RS server-side filter class that has dependency-injected constructors; refactoring a filter to add constructor parameters.","solutions":["Add a public no-args constructor to the filter class","Move required state into instance fields set from the constructor-less init or static config","Replace the filter with a new class dedicated to client-side SSE filtering"],"exampleFix":"// before\nclass MyFilter {\n    MyFilter(Logger log) { ... }\n}\n// after\nclass MyFilter {\n    public MyFilter() {}\n    MyFilter(Logger log) { ... }\n}","handlingStrategy":"validation","validationCode":"// Fail fast in a unit test before building the app\nSseEventFilter f = MyClient.class.getMethod(\"stream\").getAnnotation(SseEventFilter.class);\nassertThrows(null, () -> {\n  var ctor = f.value().getDeclaredConstructor();\n});\n// or at runtime:\nboolean ok = java.lang.reflect.Modifier.isPublic(MyFilter.class.getDeclaredConstructor().getModifiers());","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always give @SseEventFilter classes a public no-args constructor","Do not reuse server-side filters with injected constructors as client filters","Add an ArchUnit/test asserting no-arg constructors for annotated filter classes"],"tags":["rest-client","sse","annotation-processing","build-time"],"backgroundTag":"missing-no-arg-constructor","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}