{"record":{"id":"61ad58263f4170e4","repo":"flowable/flowable-engine","slug":"delegateinstance-getclass-getname-doesn-t-i","errorCode":null,"errorMessage":"${delegateInstance.getClass().getName()} doesn't implement ${HttpRequestHandler.class}","messagePattern":"(.+?) doesn't implement (.+?)","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/ClassDelegateHttpHandler.java","lineNumber":64,"sourceCode":"\n    @Override\n    public void handleHttpRequest(VariableContainer execution, HttpRequest httpRequest, FlowableHttpClient client) {\n        HttpRequestHandler httpRequestHandler = getHttpRequestHandlerInstance();\n        httpRequestHandler.handleHttpRequest(execution, httpRequest, client);\n    }\n\n    @Override\n    public void handleHttpResponse(VariableContainer execution, HttpResponse httpResponse) {\n        HttpResponseHandler httpResponseHandler = getHttpResponseHandlerInstance();\n        httpResponseHandler.handleHttpResponse(execution, httpResponse);\n    }\n\n    protected HttpRequestHandler getHttpRequestHandlerInstance() {\n        Object delegateInstance = instantiate(className);\n        if (delegateInstance instanceof HttpRequestHandler) {\n            return (HttpRequestHandler) delegateInstance;\n        } else {\n            throw new FlowableIllegalArgumentException(delegateInstance.getClass().getName() + \" doesn't implement \" + HttpRequestHandler.class);\n        }\n    }\n\n    protected HttpResponseHandler getHttpResponseHandlerInstance() {\n        Object delegateInstance = instantiate(className);\n        if (delegateInstance instanceof HttpResponseHandler) {\n            return (HttpResponseHandler) delegateInstance;\n        } else {\n            throw new FlowableIllegalArgumentException(delegateInstance.getClass().getName() + \" doesn't implement \" + HttpResponseHandler.class);\n        }\n    }\n\n}\n","sourceCodeStart":46,"sourceCodeEnd":78,"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/ClassDelegateHttpHandler.java#L46-L78","documentation":"The class-delegate HTTP handler configuration points to a class that exists and instantiates, but does not implement org.flowable.http.HttpRequestHandler. Flowable requires the configured delegate class to implement the expected handler interface.","triggerScenarios":"getHttpRequestHandlerInstance instantiates the configured className and the instanceof check fails when httpRequestHandler is accessed on the http activity.","commonSituations":"Configured a class implementing HttpResponseHandler only (or a random class) as an http request handler; wrong class in flowable:class attribute; refactoring moved interface implementations.","solutions":["Make the configured class implement org.flowable.http.HttpRequestHandler (handleHttpRequest method)","Or configure a different class that already implements HttpRequestHandler","If the delegate is meant for responses, configure it as the http response handler instead"],"exampleFix":"// before\npublic class MyHandler implements HttpResponseHandler { ... }\n// after\npublic class MyHandler implements HttpRequestHandler {\n    @Override\n    public void handleHttpRequest(VariableContainer execution, HttpRequest request, FlowableHttpClient client) { ... }\n}","handlingStrategy":"validation","validationCode":"Class<?> c = Class.forName(className);\nif (!HttpRequestHandler.class.isAssignableFrom(c)) throw new Error(className + ' must implement HttpRequestHandler');","typeGuard":"function isRequestHandler(o) { return o != null && o.handleHttpRequest != null; }","tryCatchPattern":"try { getHandler(); } catch (FlowableIllegalArgumentException e) { if (e.getMessage().contains('doesn't implement')) reconfigureDelegate(); else throw e; }","preventionTips":["Compile-time: declare delegates with 'implements HttpRequestHandler'","Add startup smoke test instantiating configured delegates","Keep request and response handler configs separate and clearly named"],"tags":["cmmn","http","delegate","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"}