Browse Source

Fix AOT processing of @MultipartConfig annotated @WebServlet

Closes gh-37637
pull/38325/head
Andy Wilkinson 2 years ago
parent
commit
e314e11985
  1. 10
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/WebServletHandler.java
  2. 17
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/ServletComponentScanRegistrarTests.java

10
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/WebServletHandler.java

@ -59,14 +59,18 @@ class WebServletHandler extends ServletComponentHandler { @@ -59,14 +59,18 @@ class WebServletHandler extends ServletComponentHandler {
: beanDefinition.getBeanClassName());
}
private MultipartConfigElement determineMultipartConfig(AnnotatedBeanDefinition beanDefinition) {
private BeanDefinition determineMultipartConfig(AnnotatedBeanDefinition beanDefinition) {
Map<String, Object> attributes = beanDefinition.getMetadata()
.getAnnotationAttributes(MultipartConfig.class.getName());
if (attributes == null) {
return null;
}
return new MultipartConfigElement((String) attributes.get("location"), (Long) attributes.get("maxFileSize"),
(Long) attributes.get("maxRequestSize"), (Integer) attributes.get("fileSizeThreshold"));
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(MultipartConfigElement.class);
builder.addConstructorArgValue(attributes.get("location"));
builder.addConstructorArgValue(attributes.get("maxFileSize"));
builder.addConstructorArgValue(attributes.get("maxRequestSize"));
builder.addConstructorArgValue(attributes.get("fileSizeThreshold"));
return builder.getBeanDefinition();
}
}

17
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/ServletComponentScanRegistrarTests.java

@ -39,6 +39,7 @@ import org.springframework.javapoet.ClassName; @@ -39,6 +39,7 @@ import org.springframework.javapoet.ClassName;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.Assertions.assertThatNoException;
/**
* Tests for {@link ServletComponentScanRegistrar}
@ -158,6 +159,16 @@ class ServletComponentScanRegistrarTests { @@ -158,6 +159,16 @@ class ServletComponentScanRegistrarTests {
.accepts(generationContext.getRuntimeHints());
}
@Test
void processAheadOfTimeSucceedsForWebServletWithMultipartConfig() {
AnnotationConfigServletWebServerApplicationContext context = new AnnotationConfigServletWebServerApplicationContext();
context.registerBean(ScanServletPackage.class);
TestGenerationContext generationContext = new TestGenerationContext(
ClassName.get(getClass().getPackageName(), "TestTarget"));
assertThatNoException()
.isThrownBy(() -> new ApplicationContextAotGenerator().processAheadOfTime(context, generationContext));
}
@SuppressWarnings("unchecked")
private void compile(GenericApplicationContext context, Consumer<GenericApplicationContext> freshContext) {
TestGenerationContext generationContext = new TestGenerationContext(
@ -215,4 +226,10 @@ class ServletComponentScanRegistrarTests { @@ -215,4 +226,10 @@ class ServletComponentScanRegistrarTests {
}
@Configuration(proxyBeanMethods = false)
@ServletComponentScan("org.springframework.boot.web.servlet.testcomponents.servlet")
static class ScanServletPackage {
}
}

Loading…
Cancel
Save