{"record":{"id":"f515fde95238a180","repo":"bumptech/glide","slug":"glidetype-methods-must-take-a-requestbuilder-obje","errorCode":null,"errorMessage":"@GlideType methods must take a RequestBuilder object as their first and only parameter, but given multiple for: {}","messagePattern":"@GlideType methods must take a RequestBuilder object as their first and only parameter, but given multiple for: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"annotation/compiler/src/main/java/com/bumptech/glide/annotation/compiler/GlideExtensionValidator.java","lineNumber":293,"sourceCode":"        types.getDeclaredType(requestBuilderElement, glideTypeElement.asType());\n    return types.isSameType(returnType, expectedType);\n  }\n\n  private boolean isRequestBuilder(TypeMirror typeMirror) {\n    if (useLegacyTypeComparison) {\n      TypeMirror toCompare = processingEnvironment.getTypeUtils().erasure(typeMirror);\n      return toCompare.toString().equals(\"com.bumptech.glide.RequestBuilder\");\n    }\n    Types types = processingEnvironment.getTypeUtils();\n    Elements elements = processingEnvironment.getElementUtils();\n    TypeMirror toCompare = types.erasure(typeMirror);\n    return Objects.equals(\n        types.asElement(toCompare), elements.getTypeElement(\"com.bumptech.glide.RequestBuilder\"));\n  }\n\n  private void validateGlideTypeParameters(ExecutableElement executableElement) {\n    if (executableElement.getParameters().size() != 1) {\n      throw new IllegalArgumentException(\n          \"@GlideType methods must take a\"\n              + \" RequestBuilder object as their first and only parameter, but given multiple for: \"\n              + getQualifiedMethodName(executableElement));\n    }\n\n    VariableElement first = executableElement.getParameters().get(0);\n    TypeMirror argumentType = first.asType();\n    if (useLegacyTypeComparison\n        ? !argumentType.toString().startsWith(\"com.bumptech.glide.RequestBuilder\")\n        : !isRequestBuilder(argumentType)) {\n      throw new IllegalArgumentException(\n          \"@GlideType methods must take a\"\n              + \" RequestBuilder object as their first and only parameter, but given: \"\n              + argumentType\n              + \" for: \"\n              + getQualifiedMethodName(executableElement));\n    }\n  }","sourceCodeStart":275,"sourceCodeEnd":311,"githubUrl":"https://github.com/bumptech/glide/blob/eb14a895d8f866e6a08c3e19d50ea3bd2c12c20a/annotation/compiler/src/main/java/com/bumptech/glide/annotation/compiler/GlideExtensionValidator.java#L275-L311","documentation":"A @GlideType method must accept exactly one parameter — the RequestBuilder<T> it operates on. validateGlideTypeParameters throws when `executableElement.getParameters().size() != 1`, covering both the zero-arg and multi-arg cases (the message says 'multiple').","triggerScenarios":"GlideExtensionValidator.validateGlideTypeParameters: `if (executableElement.getParameters().size() != 1) throw`. Hit by a no-arg `@GlideType(T.class) static RequestBuilder<T> asX()` or a method taking additional parameters beyond the RequestBuilder.","commonSituations":"Adding extra configuration parameters (Context, options) to a @GlideType method; converting a factory method and forgetting the RequestBuilder argument; mixing @GlideOption semantics (which allow extra trailing args) into @GlideType.","solutions":["Give the @GlideType method exactly one parameter: the RequestBuilder<T> matching the annotation value.","If you need extra inputs, encode them inside the method body (resolving from Application/static state) rather than as parameters."],"exampleFix":"// before\n@GlideType(GifDrawable.class)\npublic static RequestBuilder<GifDrawable> asGif(RequestBuilder<GifDrawable> requestBuilder, boolean decodeAll) {\n  ...\n}\n\n// after\n@GlideType(GifDrawable.class)\npublic static RequestBuilder<GifDrawable> asGif(RequestBuilder<GifDrawable> requestBuilder) {\n  ...\n}","handlingStrategy":"validation","validationCode":"@Test void glideTypeMethodsHaveExactlyOneParam() throws Exception {\n  for (java.lang.reflect.Method m : MyGlideExtension.class.getDeclaredMethods()) {\n    if (m.isAnnotationPresent(com.bumptech.glide.annotation.GlideType.class)) {\n      assertEquals(\"@GlideType must take exactly one param: \" + m, 1, m.getParameterCount());\n    }\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Give @GlideType methods exactly one parameter: the RequestBuilder<T>.","Do not add Context/options parameters — resolve extras inside the method body."],"tags":["glide","annotation-processing","glidetype","parameters"],"backgroundTag":null,"analyzedSha":"eb14a895d8f866e6a08c3e19d50ea3bd2c12c20a","analyzedAt":"2026-08-14T01:43:54.821Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}