{"record":{"id":"8dd3471328a67795","repo":"apache/skywalking","slug":"output-type-outputtypename-has-no-setter-setter","errorCode":null,"errorMessage":"Output type {outputTypeName} has no setter {setterName}() for output field '{fieldName}'","messagePattern":"Output type (.+?) has no setter (.+?)\\(\\) for output field '(.+?)'","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/compiler/LALBlockCodegen.java","lineNumber":488,"sourceCode":"     */\n    static void generateOutputFieldAssignment(\n            final StringBuilder sb,\n            final LALScriptModel.OutputFieldAssignment field,\n            final LALClassGenerator.GenCtx genCtx) {\n        final String fieldName = field.getFieldName();\n        final String setterName = \"set\"\n            + Character.toUpperCase(fieldName.charAt(0))\n            + fieldName.substring(1);\n\n        if (genCtx.outputType == null) {\n            throw new IllegalArgumentException(\n                \"Output field '\" + fieldName + \"' requires outputType to be set in the LAL rule config\");\n        }\n\n        // Compile-time validation: verify the setter exists on the output type\n        final Method setter = findSetter(genCtx.outputType, setterName);\n        if (setter == null) {\n            throw new IllegalArgumentException(\n                \"Output type \" + genCtx.outputType.getName()\n                + \" has no setter \" + setterName\n                + \"() for output field '\" + fieldName + \"'\");\n        }\n\n        // Generate direct setter call: _o.setXxx(value)\n        // _o is declared once at the top of the extractor method\n        final Class<?> paramType = setter.getParameterTypes()[0];\n        sb.append(\"  _o.\").append(setterName).append(\"(\");\n        final String effectiveCast = resolveEffectiveCast(paramType, field.getCastType());\n        if (paramType.isEnum()) {\n            // Auto-convert String to enum: EnumType.valueOf(stringValue.toUpperCase())\n            // toUpperCase() handles case-insensitive matching (e.g., \"slow\" → \"SLOW\")\n            sb.append(paramType.getName()).append(\".valueOf(((String) \");\n            LALValueCodegen.generateCastedValueAccess(sb, field.getValue(), \"String\", genCtx);\n            sb.append(\").toUpperCase())\");\n        } else {\n            LALValueCodegen.generateCastedValueAccess(sb, field.getValue(), effectiveCast, genCtx);","sourceCodeStart":470,"sourceCodeEnd":506,"githubUrl":"https://github.com/apache/skywalking/blob/102af09b4a56064e22050dded10e2c52e490d040/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/compiler/LALBlockCodegen.java#L470-L506","documentation":"Thrown by Layer.valueOf(String) when no registered layer carries that name — the strict name lookup matching the old enum-generated valueOf(String). The lenient sibling nameOf(String) returns Layer.UNDEFINED instead of throwing, and is the right choice for untrusted input.","triggerScenarios":"Calling Layer.valueOf(\"MYSQL\") when no such layer is registered (typo, lowercase name, or a layer defined only on another OAP deployment). Common at query/GraphQL boundaries or when parsing configuration strings.","commonSituations":"A typo'd layer name in a query or config; referencing an extension layer that is declared in layer-extensions.yml on one environment but not another; names that don't match the [A-Z][A-Z0-9_]* registry keys.","solutions":["Use Layer.nameOf(name) if a missing layer should degrade to UNDEFINED instead of failing","Fix the name string to exactly match a registered layer name (check Layer.values())","Declare the expected layer in layer-extensions.yml if it should exist in this deployment"],"exampleFix":"// before\nLayer layer = Layer.valueOf(layerName); // throws on unknown\n// after\nLayer layer = Layer.nameOf(layerName); // returns Layer.UNDEFINED on miss","handlingStrategy":"fallback","validationCode":"Layer layer = Layer.nameOf(name); // returns UNDEFINED instead of throwing","typeGuard":null,"tryCatchPattern":"try { layer = Layer.valueOf(name); } catch (IllegalArgumentException e) { layer = Layer.UNDEFINED; }","preventionTips":["Use nameOf(String) for any untrusted or user-supplied name","Validate names against Layer.values() at API boundaries"],"tags":["skywalking","oap","layer","lookup","validation"],"backgroundTag":null,"analyzedSha":"102af09b4a56064e22050dded10e2c52e490d040","analyzedAt":"2026-08-14T10:47:52.647Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}