{"record":{"id":"3d1f7148662d603b","repo":"pinpoint-apm/pinpoint","slug":"setter-must-have-return-type-void-settertype-ge","errorCode":null,"errorMessage":"Setter must have return type void: ${setterType.getName()}","messagePattern":"Setter must have return type void: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/SetterAnalyzer.java","lineNumber":60,"sourceCode":"        }\n\n        final Method[] methods = setterType.getDeclaredMethods();\n        if (methods.length != 1) {\n            throw new IllegalArgumentException(\"Setter interface must have only one method: \" + setterType.getName());\n        }\n\n        final Method setter = methods[0];\n        if (setter.getParameterCount() != 1) {\n            throw new IllegalArgumentException(\"Setter interface method must have exactly 1 argument: \" + setterType.getName());\n        }\n\n        Class<?>[] arguments = setter.getParameterTypes();\n        Class<?> fieldType = arguments[0];\n\n        Class<?> returnType = setter.getReturnType();\n\n        if (returnType != void.class) {\n            throw new IllegalArgumentException(\"Setter must have return type void: \" + setterType.getName());\n        }\n\n        return new SetterDetails(setter, fieldType);\n    }\n\n    public static final class SetterDetails {\n        private final Method setter;\n        private final Type fieldType;\n\n        public SetterDetails(Method setter, Class<?> fieldType) {\n            this.setter = setter;\n            this.fieldType = Type.getType(Objects.requireNonNull(fieldType, \"fieldType\"));\n        }\n\n        public Method getSetter() {\n            return setter;\n        }\n","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/SetterAnalyzer.java#L42-L78","documentation":"IllegalArgumentException from SetterAnalyzer.analyze when the setter interface method returns something other than void. The generated field-setter bytecode relies on the void setX(v) convention, so a non-void return type is rejected to keep generated accessors consistent with the interface.","triggerScenarios":"Declaring a setter method with a non-void return type (e.g. fluent setter returning 'this' or returning the old value) and registering it as a field setter interface.","commonSituations":"Fluent-API style setters common in modern Java plugins; porting an accessor interface from another library that permits non-void setters.","solutions":["Change the setter method's return type to void","Remove the return statement and keep the fluent call at the usage site instead","Register a separate getter interface if you need the value returned"],"exampleFix":"// before\ninterface FooSetter { FooSetter setFoo(int v); }\n// after\ninterface FooSetter { void setFoo(int v); }","handlingStrategy":"validation","validationCode":"Method m = setterType.getDeclaredMethods()[0];\nif (m.getReturnType() != void.class) {\n    throw new IllegalArgumentException(\"setter must return void\");\n}","typeGuard":"boolean isVoidSetter(Class<?> t) {\n    return t.isInterface() && t.getDeclaredMethods().length == 1\n        && t.getDeclaredMethods()[0].getParameterCount() == 1\n        && t.getDeclaredMethods()[0].getReturnType() == void.class;\n}","tryCatchPattern":"try {\n    SetterDetails d = new SetterAnalyzer().analyze(setterType);\n} catch (IllegalArgumentException e) {\n    logger.error(\"non-void setter on {}: {}\", setterType, e.getMessage());\n}","preventionTips":["Avoid fluent setter style (returning this) in field setter interfaces","Perform the fluent chaining at the call site, not inside the setter","Add a shape-check unit test for every accessor interface"],"tags":["instrumentation","interface","validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}