{"record":{"id":"242063a21c2f3d1c","repo":"pinpoint-apm/pinpoint","slug":"setter-interface-method-must-have-exactly-1-argume","errorCode":null,"errorMessage":"Setter interface method must have exactly 1 argument: ${setterType.getName()}","messagePattern":"Setter interface method must have exactly 1 argument: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/SetterAnalyzer.java","lineNumber":51,"sourceCode":"\n    private SetterAnalyzer() {\n    }\n\n    public SetterDetails analyze(Class<?> setterType) {\n        Objects.requireNonNull(setterType, \"setterType\");\n\n        if (!setterType.isInterface()) {\n            throw new IllegalArgumentException(\"setterType \" + setterType + \"is not an interface\");\n        }\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","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/SetterAnalyzer.java#L33-L69","documentation":"IllegalArgumentException from SetterAnalyzer.analyze when the single method of the setter interface does not take exactly one parameter. Field setter interfaces must have the shape void setX(FieldType v); any other arity cannot be compiled into a valid field setter.","triggerScenarios":"Defining a setter interface method with zero arguments or two or more arguments and passing it to the analyzer via a field setter definition.","commonSituations":"Plugin authors modeling a fluent setter returning the interface plus extra args; copying a getter/parameterized accessor pattern that does not fit the setter contract.","solutions":["Change the setter method to accept exactly one argument (the field value)","Use a getter interface instead if you intend to read the field","Split multi-argument updates into separate single-argument setter interfaces"],"exampleFix":"// before\ninterface NameSetter { void setName(String first, String last); }\n// after\ninterface NameSetter { void setName(String fullName); }","handlingStrategy":"validation","validationCode":"Method m = setterType.getDeclaredMethods()[0];\nif (m.getParameterCount() != 1) {\n    throw new IllegalArgumentException(\"setter must take exactly 1 argument\");\n}","typeGuard":"boolean hasSingleArgSetter(Class<?> t) {\n    return t.isInterface() && t.getDeclaredMethods().length == 1\n        && t.getDeclaredMethods()[0].getParameterCount() == 1;\n}","tryCatchPattern":"try {\n    SetterDetails d = new SetterAnalyzer().analyze(setterType);\n} catch (IllegalArgumentException e) {\n    logger.error(\"invalid setter arity on {}: {}\", setterType, e.getMessage());\n}","preventionTips":["Model setters strictly as void setX(FieldType v)","Do not carry multi-argument update methods into setter interfaces","Validate interface shape in plugin unit tests before instrumentation"],"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"}