{"record":{"id":"c36fefd2297cb823","repo":"apache/beam","slug":"schemafieldname-can-only-be-used-on-getters-in-java-beans","errorCode":null,"errorMessage":"@SchemaFieldName can only be used on getters in Java Beans. Found on setter '%s'","messagePattern":"@SchemaFieldName can only be used on getters in Java Beans\\. Found on setter '(.+?)'","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/JavaBeanSchema.java","lineNumber":126,"sourceCode":"    public List<FieldValueTypeInformation> get(TypeDescriptor<?> typeDescriptor) {\n      return ReflectUtils.getMethods(typeDescriptor.getRawType()).stream()\n          .filter(ReflectUtils::isSetter)\n          .filter(m -> !m.isAnnotationPresent(SchemaIgnore.class))\n          .map(m -> FieldValueTypeInformation.forSetter(typeDescriptor, m))\n          .map(\n              t -> {\n                Method m =\n                    Preconditions.checkNotNull(\n                        t.getMethod(), JavaBeanUtils.SETTER_WITH_NULL_METHOD_ERROR);\n                if (m.getAnnotation(SchemaFieldNumber.class) != null) {\n                  throw new RuntimeException(\n                      String.format(\n                          \"@SchemaFieldNumber can only be used on getters in Java Beans. Found on\"\n                              + \" setter '%s'\",\n                          m.getName()));\n                }\n                if (m.getAnnotation(SchemaFieldName.class) != null) {\n                  throw new RuntimeException(\n                      String.format(\n                          \"@SchemaFieldName can only be used on getters in Java Beans. Found on\"\n                              + \" setter '%s'\",\n                          m.getName()));\n                }\n                if (m.getAnnotation(SchemaCaseFormat.class) != null) {\n                  throw new RuntimeException(\n                      String.format(\n                          \"@SchemaCaseFormat can only be used on getters in Java Beans. Found on\"\n                              + \" setter '%s'\",\n                          m.getName()));\n                }\n                return t;\n              })\n          .collect(Collectors.toList());\n    }\n\n    @Override","sourceCodeStart":108,"sourceCodeEnd":144,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/JavaBeanSchema.java#L108-L144","documentation":"Thrown by JavaBeanSchema.get when a setter method carries @SchemaFieldName. JavaBean schema naming annotations must be placed on getters; a name override on a setter is ambiguous and rejected at schema-registration time.","triggerScenarios":"Annotating a setter with @SchemaFieldName; schema introspection of the bean walks setter methods and throws when it detects the annotation.","commonSituations":"Duplicating annotations on both accessor halves; generated beans emitting annotations on setters; refactoring that moved getters/setters without moving annotations.","solutions":["Move @SchemaFieldName from the setter to the corresponding getter.","Remove the annotation from the setter; field naming is defined only via getters in Java Beans."],"exampleFix":"// before\n@SchemaFieldName(\"user_name\")\npublic void setName(String name) { ... }\n\n// after\npublic void setName(String name) { ... }\n// (keep @SchemaFieldName(\"user_name\") on getName())","handlingStrategy":"validation","validationCode":"for (Method m : clazz.getMethods()) { if (m.getParameterCount() == 1 && m.isAnnotationPresent(SchemaFieldName.class)) { throw new IllegalStateException(\"@SchemaFieldName must be on the getter, not setter \" + m.getName()); } }","typeGuard":null,"tryCatchPattern":"try { schemaOf(clazz); } catch (RuntimeException e) { if (e.getMessage().contains(\"@SchemaFieldName can only be used on getters\")) { /* move annotation to getter */ } else { throw e; } }","preventionTips":["Treat getters as the single source of schema metadata for Java Beans.","Remove duplicated annotations from setters after refactors.","Add a reflection-based test asserting setters carry no schema annotations."],"tags":["java","beam-schema","annotations","javabeans"],"backgroundTag":"invalid-argument-value","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T21:17:11.552Z"}