{"record":{"id":"4416d5bda69ff9db","repo":"flowable/flowable-engine","slug":"only-one-of-timersonly-or-messagesonly-can-be-4416d5","errorCode":null,"errorMessage":"Only one of 'timersOnly' or 'messagesOnly' can be provided.","messagePattern":"Only one of 'timersOnly' or 'messagesOnly' can be provided\\.","errorType":"http","errorClass":"FlowableIllegalArgumentException","httpStatus":400,"severity":"warning","filePath":"modules/flowable-rest/src/main/java/org/flowable/rest/service/api/management/DeadLetterJobCollectionResource.java","lineNumber":128,"sourceCode":"        }\n        if (allRequestParams.containsKey(\"elementId\")) {\n            query.elementId(allRequestParams.get(\"elementId\"));\n        }\n        if (allRequestParams.containsKey(\"elementName\")) {\n            query.elementName(allRequestParams.get(\"elementName\"));\n        }\n        if (allRequestParams.containsKey(\"handlerType\")) {\n            query.handlerType(allRequestParams.get(\"handlerType\"));\n        }\n        if (allRequestParams.containsKey(\"handlerTypes\")) {\n            query.handlerTypes(Arrays.asList(allRequestParams.get(\"handlerTypes\").split(\",\")));\n        }\n        if (allRequestParams.containsKey(\"executable\")) {\n            query.executable();\n        }\n        if (allRequestParams.containsKey(\"timersOnly\")) {\n            if (allRequestParams.containsKey(\"messagesOnly\")) {\n                throw new FlowableIllegalArgumentException(\"Only one of 'timersOnly' or 'messagesOnly' can be provided.\");\n            }\n            if (Boolean.parseBoolean(allRequestParams.get(\"timersOnly\"))) {\n                query.timers();\n            }\n        }\n        if (allRequestParams.containsKey(\"messagesOnly\") && Boolean.parseBoolean(allRequestParams.get(\"messagesOnly\"))) {\n            query.messages();\n        }\n        if (allRequestParams.containsKey(\"dueBefore\")) {\n            query.duedateLowerThan(RequestUtil.getDate(allRequestParams, \"dueBefore\"));\n        }\n        if (allRequestParams.containsKey(\"dueAfter\")) {\n            query.duedateHigherThan(RequestUtil.getDate(allRequestParams, \"dueAfter\"));\n        }\n        if (allRequestParams.containsKey(\"withException\") && Boolean.parseBoolean(allRequestParams.get(\"withException\"))) {\n            query.withException();\n        }\n        if (allRequestParams.containsKey(\"exceptionMessage\")) {","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-rest/src/main/java/org/flowable/rest/service/api/management/DeadLetterJobCollectionResource.java#L110-L146","documentation":"The dead-letter job list endpoint (GET /management/dead-letter-jobs) accepts optional 'timersOnly' and 'messagesOnly' query parameters to narrow the query to timer or message jobs. Supplying both is contradictory, so the controller immediately throws FlowableIllegalArgumentException. It is a pure client-side request-validation error — nothing is executed.","triggerScenarios":"Calling GET /management/dead-letter-jobs with both query params present, e.g. ?timersOnly=true&messagesOnly=true — note the check is on parameter presence (containsKey), so even ?timersOnly=false&messagesOnly=false triggers it.","commonSituations":"A generic job-filter builder appending both flags unconditionally; a UI sending both toggles; clients modeled after other Flowable endpoints that allow combined filters.","solutions":["Send at most one of the two parameters; omit the other entirely.","If neither filter is wanted, send neither parameter (plain /management/dead-letter-jobs returns all).","Fix the client/request builder so flags are mutually exclusive (e.g. if (timersOnly) add timersOnly else if (messagesOnly) add messagesOnly).","Remember presence alone triggers the error: don't send empty or false values for both."],"exampleFix":"// before\nString url = \"/management/dead-letter-jobs?timersOnly=\" + timers + \"&messagesOnly=\" + messages; // both always sent\n// after\nStringBuilder q = new StringBuilder(\"/management/dead-letter-jobs\");\nif (timers) q.append(\"?timersOnly=true\"); else if (messages) q.append(\"?messagesOnly=true\");","handlingStrategy":"validation","validationCode":"if (params.containsKey(\"timersOnly\") && params.containsKey(\"messagesOnly\")) {\n    throw new IllegalArgumentException(\"Provide at most one of timersOnly/messagesOnly\");\n}","typeGuard":null,"tryCatchPattern":"try { jobs = client.getDeadLetterJobs(params); }\ncatch (FlowableIllegalArgumentException e) { /* strip conflicting params and retry with a single filter */ }","preventionTips":["Build the query string conditionally so only one flag is ever appended.","Never send both parameters, even with false/empty values — presence alone is rejected.","Centralize dead-letter job filtering in one helper that enforces exclusivity.","Omit both flags when no job-type filter is desired."],"tags":["rest-api","flowable","validation","query-parameters"],"backgroundTag":"mutually-exclusive-flags","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}