{"record":{"id":"b98add8a3c69d9d4","repo":"quarkusio/quarkus","slug":"must-set-either-comment-or-data","errorCode":null,"errorMessage":"Must set either comment or data","messagePattern":"Must set either comment or data","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/jaxrs/OutboundSseEventImpl.java","lineNumber":201,"sourceCode":"        public BuilderImpl data(Object data) {\n            Objects.requireNonNull(data);\n\n            if (data instanceof GenericEntity) {\n                GenericEntity<?> genericEntity = (GenericEntity<?>) data;\n                this.type = genericEntity.getRawType();\n                this.genericType = genericEntity.getType();\n                this.data = genericEntity.getEntity();\n            } else {\n                data(data.getClass(), data);\n            }\n\n            return this;\n        }\n\n        @Override\n        public OutboundSseEventImpl build() {\n            if (this.comment == null && this.data == null) {\n                throw new IllegalArgumentException(\"Must set either comment or data\");\n            }\n            return new OutboundSseEventImpl(name, id, reconnectDelay, type, genericType, mediaType, data, comment);\n        }\n    }\n}\n","sourceCodeStart":183,"sourceCodeEnd":207,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/jaxrs/OutboundSseEventImpl.java#L183-L207","documentation":"OutboundSseEventImpl.Builder.build() validates that an outbound SSE event carries content: at least one of a comment or data must be set. An event with neither would serialize to an empty/invalid SSE frame, so IllegalArgumentException is thrown.","triggerScenarios":"Building an OutboundSseEvent via newEventBuilder() and calling build() without calling either comment(...) or data(...) — e.g. only setting name/id/reconnectDelay, or conditionally skipping data and leaving it unset.","commonSituations":"Dynamically built SSE events where a null entity silently skips data(...); refactors that renamed data-setting methods; mapping code that filters out payloads but still emits an event object.","solutions":["Call data(...) with a non-null payload before build()","Or call comment(...) for keep-alive/annotation-only events","Skip emitting the event entirely when there is no content","If null data is legitimate, convert it to an explicit empty string or placeholder"],"exampleFix":"// before\nOutboundSseEvent evt = sse.newEventBuilder()\n    .name(\"update\")\n    .build(); // no comment or data\n// after\nOutboundSseEvent evt = sse.newEventBuilder()\n    .name(\"update\")\n    .data(payload != null ? payload : \"\")\n    .build();","handlingStrategy":"validation","validationCode":"if (eventData == null && eventComment == null) {\n    throw new IllegalArgumentException(\"SSE event needs comment or data\");\n}","typeGuard":null,"tryCatchPattern":"try { return builder.build(); } catch (IllegalArgumentException e) { if (e.getMessage().equals(\"Must set either comment or data\")) { return builder.data(\"\").build(); } throw e; }","preventionTips":["Always set data(...) or comment(...) before build()","Skip event emission when payload is absent","Default null payloads to an explicit empty string or sentinel"],"tags":["resteasy-reactive","sse","server-sent-events","builder-validation"],"backgroundTag":"sse-event-missing-payload","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"}