{"record":{"id":"8875fd9e5123aa59","repo":"pinpoint-apm/pinpoint","slug":"setter-interface-must-have-only-one-method-sett","errorCode":null,"errorMessage":"Setter interface must have only one method: ${setterType.getName()}","messagePattern":"Setter interface must have only one method: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/SetterAnalyzer.java","lineNumber":45,"sourceCode":"public class SetterAnalyzer {\n    private static final SetterAnalyzer INSTANCE = new SetterAnalyzer();\n\n    public static SetterAnalyzer instance() {\n        return INSTANCE;\n    }\n\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);","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/SetterAnalyzer.java#L27-L63","documentation":"IllegalArgumentException from SetterAnalyzer.analyze when the supplied setter interface declares more or fewer than exactly one declared method. Setter interfaces in Pinpoint's field-access instrumentation must contain a single method so bytecode generation knows unambiguously which method implements the setter.","triggerScenarios":"Passing an interface with 0 methods (marker interface) or 2+ methods to a field setter definition, e.g. via newSetterType or a plugin's field accessor definition.","commonSituations":"Plugin authors defining a convenience interface with an extra helper method and using it as a setter interface; accidentally passing a generic callback interface instead of a dedicated setter interface.","solutions":["Reduce the interface to exactly one abstract setter method","Move extra helper methods to a separate interface or make them static","Create a dedicated single-method setter interface for the field"],"exampleFix":"// before\ninterface FooSetter { void setFoo(int v); void clear(); }\n// after\ninterface FooSetter { void setFoo(int v); }\ninterface FooClearer { void clear(); }","handlingStrategy":"validation","validationCode":"if (setterType.isInterface() && setterType.getDeclaredMethods().length != 1) {\n    throw new IllegalArgumentException(setterType + \" must declare exactly one method\");\n}","typeGuard":"boolean isSingleMethodInterface(Class<?> t) {\n    return t.isInterface() && t.getDeclaredMethods().length == 1;\n}","tryCatchPattern":"try {\n    SetterDetails d = new SetterAnalyzer().analyze(setterType);\n} catch (IllegalArgumentException e) {\n    logger.error(\"invalid setter interface {}: {}\", setterType, e.getMessage());\n}","preventionTips":["Keep one dedicated single-method interface per field","Move helper methods to separate interfaces or make them static","Review interface definitions with a single-abstract-method check before registering"],"tags":["instrumentation","interface","validation"],"backgroundTag":"schema-validation-failed","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"}