{"record":{"id":"5c2baf4965d917ef","repo":"conductor-oss/conductor","slug":"missing-wrapper-class","errorCode":null,"errorMessage":"missing wrapper class: ","messagePattern":"missing wrapper class: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/WrappedType.java","lineNumber":35,"sourceCode":"\nimport javax.lang.model.element.Modifier;\n\nimport com.squareup.javapoet.MethodSpec;\nimport com.squareup.javapoet.TypeName;\n\npublic class WrappedType extends AbstractType {\n    private AbstractType realType;\n    private MessageType wrappedType;\n\n    public static WrappedType wrap(GenericType realType) {\n        Type valueType = realType.getValueType().getJavaType();\n        if (!(valueType instanceof Class))\n            throw new IllegalArgumentException(\"cannot wrap primitive type: \" + valueType);\n\n        String className = ((Class) valueType).getSimpleName() + realType.getWrapperSuffix();\n        MessageType wrappedType = TypeMapper.INSTANCE.get(className);\n        if (wrappedType == null)\n            throw new IllegalArgumentException(\"missing wrapper class: \" + className);\n        return new WrappedType(realType, wrappedType);\n    }\n\n    public WrappedType(AbstractType realType, MessageType wrappedType) {\n        super(realType.getJavaType(), wrappedType.getJavaProtoType());\n        this.realType = realType;\n        this.wrappedType = wrappedType;\n    }\n\n    @Override\n    public String getProtoType() {\n        return wrappedType.getProtoType();\n    }\n\n    @Override\n    public TypeName getRawJavaType() {\n        return realType.getRawJavaType();\n    }","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/WrappedType.java#L17-L53","documentation":"Thrown as IllegalArgumentException by WrappedType.wrap after computing the expected wrapper class name (value simple name + suffix) and not finding a MessageType registered under that simple name in TypeMapper. protogen expects a generated wrapper message (e.g. StringMap) to exist for the collection/map value; if discovery did not declare it, wrapping cannot proceed.","triggerScenarios":"A collection/map field whose value requires a wrapper (non-scalar value) but the corresponding wrapper message class was never declared — e.g. the wrapper source was not generated/registered, or the value type's simple name does not match the expected wrapper naming convention.","commonSituations":"Custom value types whose names do not follow the suffix convention expected by protogen; running protogen without first generating the wrapper messages; a partial codegen where wrapper messages were excluded.","solutions":["Confirm the wrapper message for the value type is generated and registered before WrappedType.wrap runs.","Ensure value type simple names follow the naming protogen derives (Simple + suffix like 'Map').","Use scalar value types where possible so no wrapper is needed (List<String>, Map<String,Integer>).","If a custom wrapper is intended, declare it via TypeMapper.declare so get(className) resolves it."],"exampleFix":"// before — value type has no registered wrapper\nMap<String, Custom> map; // 'CustomMap' not declared\n// after — use scalar value, or ensure CustomMap wrapper is generated\nMap<String, String> map;  // scalar needs no wrapper","handlingStrategy":"validation","validationCode":"String wrapperName = ((Class) valueType).getSimpleName() + realType.getWrapperSuffix();\nif (TypeMapper.INSTANCE.get(wrapperName) == null) {\n    throw new IllegalStateException(\n        \"No protogen wrapper registered for \" + wrapperName + \"; generate/register it first or use a scalar value type.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Ensure wrapper messages are generated and registered before WrappedType.wrap runs.","Prefer scalar collection values to avoid wrappers entirely.","Declare any custom wrapper via TypeMapper.declare so get(className) resolves it."],"tags":["protogen","protobuf","type-mapping","codegen"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}