{"record":{"id":"38de3c7df6930810","repo":"flowable/flowable-engine","slug":"error-writing-form-model-response","errorCode":null,"errorMessage":"Error writing form model response","messagePattern":"Error writing form model response","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-rest/src/main/java/org/flowable/cmmn/rest/service/api/CmmnRestResponseFactory.java","lineNumber":257,"sourceCode":"        response.setGraphicalNotationDefined(caseDefinition.hasGraphicalNotation());\n        response.setStartFormDefined(caseDefinition.hasStartFormKey());\n        response.setTenantId(caseDefinition.getTenantId());\n\n        // Links to other resources\n        response.setDeploymentId(caseDefinition.getDeploymentId());\n        response.setDeploymentUrl(urlBuilder.buildUrl(CmmnRestUrls.URL_DEPLOYMENT, caseDefinition.getDeploymentId()));\n        response.setResource(urlBuilder.buildUrl(CmmnRestUrls.URL_DEPLOYMENT_RESOURCE, caseDefinition.getDeploymentId(), caseDefinition.getResourceName()));\n        if (caseDefinition.getDiagramResourceName() != null) {\n            response.setDiagramResource(urlBuilder.buildUrl(CmmnRestUrls.URL_DEPLOYMENT_RESOURCE, caseDefinition.getDeploymentId(), caseDefinition.getDiagramResourceName()));\n        }\n        return response;\n    }\n    \n    public String getFormModelString(FormModelResponse formModelResponse) {\n        try {\n            return objectMapper.writeValueAsString(formModelResponse);\n        } catch (Exception e) {\n            throw new FlowableException(\"Error writing form model response\", e);\n        }\n    }\n\n    public List<RestVariable> createRestVariables(Map<String, Object> variables, String id, int variableType) {\n        RestUrlBuilder urlBuilder = createUrlBuilder();\n        List<RestVariable> result = new ArrayList<>(variables.size());\n\n        for (Entry<String, Object> pair : variables.entrySet()) {\n            result.add(createRestVariable(pair.getKey(), pair.getValue(), null, id, variableType, false, urlBuilder));\n        }\n\n        return result;\n    }\n\n    public List<RestVariable> createRestVariables(Map<String, Object> variables, String id, int variableType, RestVariableScope scope) {\n        RestUrlBuilder urlBuilder = createUrlBuilder();\n        List<RestVariable> result = new ArrayList<>(variables.size());\n","sourceCodeStart":239,"sourceCodeEnd":275,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-rest/src/main/java/org/flowable/cmmn/rest/service/api/CmmnRestResponseFactory.java#L239-L275","documentation":"getFormModelString serializes a FormModelResponse to JSON with Jackson's ObjectMapper. Any exception during serialization (unwritable property, circular reference, custom serializer failure) is wrapped in a FlowableException with this message.","triggerScenarios":"Calling getFormModelString on a FormModelResponse whose properties cannot be serialized by the configured ObjectMapper (e.g. object with no accessible getters, self-referencing structure).","commonSituations":"Custom form model implementations with non-Jackson-friendly fields;Jackson configuration (FAIL_ON_EMPTY_BEANS) triggered by null/empty beans; version changes in form model classes.","solutions":["Inspect the wrapped cause to identify which property failed serialization","Add getters or @JsonIgnore to offending fields in the form model","Enable/disable appropriate Jackson features on the ObjectMapper (e.g. SerializationFeature.FAIL_ON_EMPTY_BEANS)","Ensure only standard FormModelResponse implementations are passed to this factory"],"exampleFix":"// before\nclass MyFormModel { private Object selfRef; void init(){ selfRef = this; } }\n// after\nclass MyFormModel { @JsonIgnore private Object selfRef; }","handlingStrategy":"try-catch","validationCode":"new ObjectMapper().writeValueAsString(formModelResponse); // dry-run serialization check","typeGuard":null,"tryCatchPattern":"try {\n    String json = factory.getFormModelString(formModelResponse);\n} catch (FlowableException e) {\n    logger.error(\"Form model serialization failed\", e.getCause());\n}","preventionTips":["Keep form model classes Jackson-friendly (getters, no cycles, @JsonIgnore on internals)","Dry-run serialize custom models in tests","Pin Jackson configuration deliberately (FAIL_ON_EMPTY_BEANS etc.)"],"tags":["rest","json","serialization","jackson"],"backgroundTag":"json-serialization-failed","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"}