quarkusio/quarkus · error · IllegalArgumentException

Parameter type is not supported for method of class

Error message

Parameter type <type> is not supported for method<method> of class<class>

What it means

After iterating the parameters of a @ControllerAdvice exception-handler method, preGenerateMethodBody throws IllegalArgumentException if any parameter was neither an Exception subtype, HttpServletRequest, nor HttpServletResponse — those are the only parameter types the generated exception mapper can supply. The deployment fails and names the unsupported type, method, and class.

Solutions

  1. Remove unsupported parameters, keeping only Exception subtypes, HttpServletRequest, and HttpServletResponse
  2. Replace Spring-specific types like WebRequest/HandlerMethod with HttpServletRequest equivalents
  3. Obtain extra data (e.g. session attributes) inside the method body from the injected request instead of via parameters

Example fix

// before
@ExceptionHandler(Exception.class)
void handle(Exception e, WebRequest request) {...}
// after
@ExceptionHandler(Exception.class)
void handle(Exception e, HttpServletRequest req) {...}
Defensive patterns

Strategy: validation

Validate before calling

for (Class<?> p : handlerParams) {
  boolean ok = Exception.class.isAssignableFrom(p) || HttpServletRequest.class.isAssignableFrom(p)
            || HttpServletResponse.class.isAssignableFrom(p);
  if (!ok) throw new IllegalStateException("Unsupported @ControllerAdvice param: " + p);
}

Type guard

boolean isSupportedParam(Class<?> t) {
  return Exception.class.isAssignableFrom(t)
      || HttpServletRequest.class.isAssignableFrom(t)
      || HttpServletResponse.class.isAssignableFrom(t);
}

Prevention

When it happens

Trigger: Declaring an @ExceptionHandler method with a parameter of an unsupported type, e.g. @ExceptionHandler(MyException.class) void handle(MyException e, Model model) or HttpSession, Principal, Locale, etc.

Common situations: Migrating Spring @ControllerAdvice handlers verbatim; Spring-specific parameter types (WebRequest, HandlerMethod, Model) that Quarkus' generator does not support; leftover unused parameters from refactoring.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/e1edd27f2464cc71. Report an issue: GitHub.

Appendix: source

Thrown at extensions/spring-web/core/deployment/src/main/java/io/quarkus/spring/web/deployment/ControllerAdviceExceptionMapperGenerator.java:135

                            + " is being used multiple times in method" + controllerAdviceMethod.name() + " of class"
                            + controllerAdviceMethod.declaringClass().name());
                }

                // we need to generate a field that injects the HttpServletResponse into the class
                FieldDesc httpResponseField = cc.field("httpServletResponse", fc -> {
                    fc.setType(HttpServletResponse.class);
                    fc.private_();
                    fc.addAnnotation(Context.class);
                });

                // stash the fieldCreator in a map indexed by the parameter type so we can retrieve it later
                parameterTypeToField.put(parameterType, httpResponseField);
            } else {
                notAllowedParameterIndex = i;
            }
        }
        if (notAllowedParameterIndex >= 0) {
            throw new IllegalArgumentException(
                    "Parameter type " + parameterTypes.get(notAllowedParameterIndex).name() + " is not supported for method"
                            + controllerAdviceMethod.name() + " of class" + controllerAdviceMethod.declaringClass().name());
        }

        createHttpHeadersField(cc);
    }

    private void createHttpHeadersField(ClassCreator classCreator) {
        httpHeadersField = classCreator.field("httpHeaders", fc -> {
            fc.setType(HttpHeaders.class);
            fc.private_();
            fc.addAnnotation(Context.class);
        });
    }

    @Override
    void generateMethodBody(BlockCreator bc, Expr thisRef, Expr exceptionParam) {
        if (isVoidType(returnType)) {

View on GitHub (pinned to e1c734241f)