bumptech/glide · error · IllegalArgumentException

@GlideType methods must take a RequestBuilder object as thei

Error message

@GlideType methods must take a RequestBuilder object as their first and only parameter, but given multiple for: {}

What it means

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').

Source

Thrown at annotation/compiler/src/main/java/com/bumptech/glide/annotation/compiler/GlideExtensionValidator.java:293

        types.getDeclaredType(requestBuilderElement, glideTypeElement.asType());
    return types.isSameType(returnType, expectedType);
  }

  private boolean isRequestBuilder(TypeMirror typeMirror) {
    if (useLegacyTypeComparison) {
      TypeMirror toCompare = processingEnvironment.getTypeUtils().erasure(typeMirror);
      return toCompare.toString().equals("com.bumptech.glide.RequestBuilder");
    }
    Types types = processingEnvironment.getTypeUtils();
    Elements elements = processingEnvironment.getElementUtils();
    TypeMirror toCompare = types.erasure(typeMirror);
    return Objects.equals(
        types.asElement(toCompare), elements.getTypeElement("com.bumptech.glide.RequestBuilder"));
  }

  private void validateGlideTypeParameters(ExecutableElement executableElement) {
    if (executableElement.getParameters().size() != 1) {
      throw new IllegalArgumentException(
          "@GlideType methods must take a"
              + " RequestBuilder object as their first and only parameter, but given multiple for: "
              + getQualifiedMethodName(executableElement));
    }

    VariableElement first = executableElement.getParameters().get(0);
    TypeMirror argumentType = first.asType();
    if (useLegacyTypeComparison
        ? !argumentType.toString().startsWith("com.bumptech.glide.RequestBuilder")
        : !isRequestBuilder(argumentType)) {
      throw new IllegalArgumentException(
          "@GlideType methods must take a"
              + " RequestBuilder object as their first and only parameter, but given: "
              + argumentType
              + " for: "
              + getQualifiedMethodName(executableElement));
    }
  }

View on GitHub (pinned to eb14a895d8)

Solutions

  1. Give the @GlideType method exactly one parameter: the RequestBuilder<T> matching the annotation value.
  2. If you need extra inputs, encode them inside the method body (resolving from Application/static state) rather than as parameters.

Example fix

// before
@GlideType(GifDrawable.class)
public static RequestBuilder<GifDrawable> asGif(RequestBuilder<GifDrawable> requestBuilder, boolean decodeAll) {
  ...
}

// after
@GlideType(GifDrawable.class)
public static RequestBuilder<GifDrawable> asGif(RequestBuilder<GifDrawable> requestBuilder) {
  ...
}
Defensive patterns

Strategy: validation

Validate before calling

@Test void glideTypeMethodsHaveExactlyOneParam() throws Exception {
  for (java.lang.reflect.Method m : MyGlideExtension.class.getDeclaredMethods()) {
    if (m.isAnnotationPresent(com.bumptech.glide.annotation.GlideType.class)) {
      assertEquals("@GlideType must take exactly one param: " + m, 1, m.getParameterCount());
    }
  }
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of bumptech/glide@eb14a895d8 (2026-08-14). Data as JSON: /api/errors/f515fde95238a180. Report an issue: GitHub.