Provide dedicated AOT exception hierarchy

This commit adds a number of catch point that provides additional
context when an AOT processor fails to execute. Amongst other things,
this makes sure that the bean name and its descriptor is consistently
provided in the error message when available.

Closes gh-32777
This commit is contained in:
Stéphane Nicoll
2024-06-03 15:45:15 +02:00
parent f31113e325
commit 42ace2c2c9
13 changed files with 294 additions and 33 deletions

View File

@@ -21,11 +21,14 @@ import java.util.Collections;
import java.util.List;
import org.springframework.aot.generate.GenerationContext;
import org.springframework.beans.factory.aot.AotException;
import org.springframework.beans.factory.aot.AotProcessingException;
import org.springframework.beans.factory.aot.AotServices;
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor;
import org.springframework.beans.factory.aot.BeanFactoryInitializationCode;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.lang.Nullable;
/**
* A collection of {@link BeanFactoryInitializationAotContribution AOT
@@ -63,8 +66,7 @@ class BeanFactoryInitializationAotContributions {
List<BeanFactoryInitializationAotProcessor> processors) {
List<BeanFactoryInitializationAotContribution> contributions = new ArrayList<>();
for (BeanFactoryInitializationAotProcessor processor : processors) {
BeanFactoryInitializationAotContribution contribution = processor
.processAheadOfTime(beanFactory);
BeanFactoryInitializationAotContribution contribution = processAheadOfTime(processor, beanFactory);
if (contribution != null) {
contributions.add(contribution);
}
@@ -72,6 +74,22 @@ class BeanFactoryInitializationAotContributions {
return Collections.unmodifiableList(contributions);
}
@Nullable
private BeanFactoryInitializationAotContribution processAheadOfTime(BeanFactoryInitializationAotProcessor processor,
DefaultListableBeanFactory beanFactory) {
try {
return processor.processAheadOfTime(beanFactory);
}
catch (AotException ex) {
throw ex;
}
catch (Exception ex) {
throw new AotProcessingException("Error executing '" +
processor.getClass().getName() + "': " + ex.getMessage(), ex);
}
}
void applyTo(GenerationContext generationContext,
BeanFactoryInitializationCode beanFactoryInitializationCode) {
for (BeanFactoryInitializationAotContribution contribution : this.contributions) {