quarkusio/quarkus · error · IllegalArgumentException
Spring @Transactional with propagation NESTED is not support
Error message
Spring @Transactional with propagation NESTED is not supported by Quarkus. Offending location: <target>
What it means
SpringTransactionalProcessor.validateTransactionalAnnotations fails the build at deployment time when a Spring @Transactional annotation declares propagation = NESTED, which Quarkus/Narayana's Spring-compatible layer does not implement. The message names the offending location via SpringTransactionalUtil.describeTarget.
Source
Thrown at extensions/spring-tx/deployment/src/main/java/io/quarkus/spring/tx/deployment/SpringTransactionalProcessor.java:40
@BuildStep
FeatureBuildItem feature() {
return new FeatureBuildItem(Feature.SPRING_TX);
}
@BuildStep
AnnotationsTransformerBuildItem transform() {
return new AnnotationsTransformerBuildItem(new SpringTransactionalAnnotationsTransformer());
}
@BuildStep
@Produce(ServiceStartBuildItem.class)
void validateTransactionalAnnotations(CombinedIndexBuildItem combinedIndex) {
Collection<AnnotationInstance> instances = combinedIndex.getIndex()
.getAnnotations(SPRING_TRANSACTIONAL);
for (AnnotationInstance instance : instances) {
AnnotationValue propagationValue = instance.value("propagation");
if (propagationValue != null && "NESTED".equals(propagationValue.asEnum())) {
throw new IllegalArgumentException(
"Spring @Transactional with propagation NESTED is not supported by Quarkus. "
+ "Offending location: "
+ SpringTransactionalUtil.describeTarget(instance.target()));
}
}
}
}
View on GitHub (pinned to e1c734241f)
Solutions
- Replace Propagation.NESTED with Propagation.REQUIRED (or another supported value such as REQUIRES_NEW)
- Refactor the method so partial rollback is handled with explicit exception handling inside a single transaction
- Remove the propagation attribute entirely to use the default REQUIRED behavior
- If savepoint semantics are essential, use jakarta.transaction APIs / transactional semantics Quarkus supports
Example fix
// before
@Transactional(propagation = Propagation.NESTED)
public void doWork() {...}
// after
@Transactional(propagation = Propagation.REQUIRED)
public void doWork() {...} Defensive patterns
Strategy: validation
Validate before calling
// search the codebase before building: // grep -r 'Propagation.NESTED' src/ -> must return nothing when using quarkus-spring-tx
Prevention
- Never use Propagation.NESTED with quarkus-spring-tx
- Migrate NESTED usage to REQUIRED plus in-method exception handling
- Check for NESTED when porting Spring Boot projects to Quarkus
- Note this fails at build time, so run a compile early in migration
When it happens
Trigger: Using org.springframework.transaction.annotation.Transactional(propagation = Propagation.NESTED) on a bean method/class in a Quarkus application that includes the quarkus-spring-tx extension.
Common situations: Porting a Spring Boot app to Quarkus that relied on JDBC savepoints for partial rollback; copy-pasting Spring configuration including NESTED propagation; Spring migration guides recommending NESTED for nested transactions.
Related errors
- Driver is not an XA dataSource, while XA has been enabled in
- spEL expressions are not currently supported. Offending meth
- Failed to open path tree with root %s
- Dev services for ${request.getName()} requires a startable s
- Name cannot start with '/':${name}
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/3e506aecb5d13c3a.
Report an issue: GitHub.