{"record":{"id":"835c0131a418aabb","repo":"flowable/flowable-engine","slug":"delegate-expression-expression-did-not-resolve-835c01","errorCode":null,"errorMessage":"Delegate expression ${expression} did not resolve to an implementation of ${HttpResponseHandler.class}","messagePattern":"Delegate expression (.+?) did not resolve to an implementation of (.+?)","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/behavior/impl/http/handler/DelegateExpressionHttpHandler.java","lineNumber":62,"sourceCode":"    }\n\n    @Override\n    public void handleHttpRequest(VariableContainer execution, HttpRequest httpRequest, FlowableHttpClient client) {\n        Object delegate = DelegateExpressionUtil.resolveDelegateExpression(expression, execution, fieldExtensions);\n        if (delegate instanceof HttpRequestHandler) {\n            ((HttpRequestHandler) delegate).handleHttpRequest(execution, httpRequest, client);\n        } else {\n            throw new FlowableIllegalArgumentException(\"Delegate expression \" + expression + \" did not resolve to an implementation of \" + HttpRequestHandler.class);\n        }\n    }\n\n    @Override\n    public void handleHttpResponse(VariableContainer execution, HttpResponse httpResponse) {\n        Object delegate = resolveDelegateExpression(expression, execution, fieldExtensions);\n        if (delegate instanceof HttpResponseHandler) {\n            ((HttpResponseHandler) delegate).handleHttpResponse(execution, httpResponse);\n        } else {\n            throw new FlowableIllegalArgumentException(\"Delegate expression \" + expression + \" did not resolve to an implementation of \" + HttpResponseHandler.class);\n        }\n    }\n\n    /**\n     * returns the expression text for this execution listener. Comes in handy if you want to check which listeners you already have.\n     */\n    public String getExpressionText() {\n        return expression.getExpressionText();\n    }\n\n    public static Object resolveDelegateExpression(Expression expression,\n                                                   VariableContainer variableScope, List<FieldExtension> fieldExtensions) {\n\n        // Note: we can't cache the result of the expression, because the\n        // execution can change: eg. delegateExpression='${mySpringBeanFactory.randomSpringBean()}'\n        Object delegate = expression.getValue(variableScope);\n\n        if (fieldExtensions != null && fieldExtensions.size() > 0) {","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/behavior/impl/http/handler/DelegateExpressionHttpHandler.java#L44-L80","documentation":"A delegate expression used as an HTTP response handler resolved, but the resulting object does not implement HttpResponseHandler. Enforced at response-handling time in DelegateExpressionHttpHandler.handleHttpResponse.","triggerScenarios":"handleHttpResponse resolves the expression to a non-HttpResponseHandler object when an HTTP response arrives in a CMMN http service task.","commonSituations":"Expression pointing to a request handler bean (wrong interface); Spring bean returning a different type than expected; config copied from request handler block.","solutions":["Point the delegate expression to an object implementing org.flowable.http.HttpResponseHandler","Implement HttpResponseHandler in the target class","Correct the expression if it references the wrong bean"],"exampleFix":"// before\n<flowable:response-handler delegateExpression=\"${requestHandler}\" />\n// after\n<flowable:response-handler delegateExpression=\"${responseHandler}\" /> <!-- implements HttpResponseHandler -->","handlingStrategy":"try-catch","validationCode":"Object d = context.getBean(beanName);\nif (!(d instanceof HttpResponseHandler)) throw new Error(beanName + ' is not an HttpResponseHandler');","typeGuard":"function isHttpResponseHandler(o) { return o != null && typeof o.handleHttpResponse === 'function'; }","tryCatchPattern":"try { handleResponse(); } catch (FlowableIllegalArgumentException e) { if (e.getMessage().contains('did not resolve')) fixBeanReference(); else throw e; }","preventionTips":["Match handler interface to handler slot (request vs response)","Integration-test http tasks end-to-end before deploy","Document bean responsibilities to avoid cross-wiring"],"tags":["cmmn","http","delegate-expression","type-mismatch"],"backgroundTag":"type-mismatch","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}