quarkusio/quarkus · error · IllegalStateException

Dev UI problem: monitoring of CDI business method invocation

Error message

Dev UI problem: monitoring of CDI business method invocations not possible
	- quarkus.arc.transform-unproxyable-classes was set to false and therefore it would not be possible to apply interceptors to unproxyable bean classes
	- please disable the monitoring feature via quarkus.arc.dev-mode.monitoring-enabled=false or enable unproxyable classes transformation

What it means

The Arc Dev UI monitoring feature intercepts CDI business method invocations, which requires bean classes to be proxied/transformed. If quarkus.arc.transform-unproxyable-classes=false, unproxyable bean classes cannot get the monitoring interceptor applied, so registerMonitoringComponents() fails the build with instructions to either disable monitoring or re-enable transformation.

Source

Thrown at extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/devui/ArcDevUIProcessor.java:121

        }

        return pageBuildItem;
    }

    @BuildStep(onlyIf = IsLocalDevelopment.class)
    JsonRPCProvidersBuildItem createJsonRPCService() {
        return new JsonRPCProvidersBuildItem(ArcJsonRPCService.class);
    }

    @BuildStep(onlyIf = IsLocalDevelopment.class)
    void registerMonitoringComponents(ArcConfig config, BuildProducer<AdditionalBeanBuildItem> beans,
            BuildProducer<AnnotationsTransformerBuildItem> annotationTransformers,
            CustomScopeAnnotationsBuildItem customScopes, List<BeanDefiningAnnotationBuildItem> beanDefiningAnnotations) {
        if (!config.devMode().monitoringEnabled()) {
            return;
        }
        if (!config.transformUnproxyableClasses()) {
            throw new IllegalStateException(
                    "Dev UI problem: monitoring of CDI business method invocations not possible\n\t- quarkus.arc.transform-unproxyable-classes was set to false and therefore it would not be possible to apply interceptors to unproxyable bean classes\n\t- please disable the monitoring feature via quarkus.arc.dev-mode.monitoring-enabled=false or enable unproxyable classes transformation");
        }
        // Register beans
        beans.produce(AdditionalBeanBuildItem.builder().setUnremovable()
                .addBeanClasses(EventsMonitor.class, InvocationTree.class, InvocationsMonitor.class,
                        InvocationInterceptor.class,
                        Monitored.class)
                .build());

        // Add @Monitored to all beans
        Set<DotName> skipNames = Set.of(DotName.createSimple(InvocationTree.class),
                DotName.createSimple(InvocationsMonitor.class), DotName.createSimple(EventsMonitor.class));
        annotationTransformers.produce(new AnnotationsTransformerBuildItem(AnnotationsTransformer
                .appliedToClass()
                .whenClass(c -> (customScopes.isScopeDeclaredOn(c)
                        || isAdditionalBeanDefiningAnnotationOn(c, beanDefiningAnnotations))
                        && !skipClass(c, skipNames))
                .thenTransform(t -> t.add(Monitored.class))));

View on GitHub (pinned to e1c734241f)

Solutions

  1. Set quarkus.arc.transform-unproxyable-classes=true (remove the explicit false)
  2. Or set quarkus.arc.dev-mode.monitoring-enabled=false to disable monitoring
  3. Keep both properties consistent in application.properties / profiles
  4. Review why transformation was disabled — re-enabling may fix hidden interceptor issues too

Example fix

# before
quarkus.arc.transform-unproxyable-classes=false
# after (option A)
quarkus.arc.transform-unproxyable-classes=true
# after (option B)
quarkus.arc.dev-mode.monitoring-enabled=false
Defensive patterns

Strategy: validation

Validate before calling

// application.properties check:
// NOT both: quarkus.arc.dev-mode.monitoring-enabled=true AND quarkus.arc.transform-unproxyable-classes=false

Prevention

When it happens

Trigger: Setting quarkus.arc.dev-mode.monitoring-enabled=true (default) together with quarkus.arc.transform-unproxyable-classes=false in application.properties.

Common situations: Projects that disabled unproxyable-class transformation for build speed or legacy compatibility, then enabled Dev UI invocation monitoring; defaults colliding after an upgrade.

Related errors


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