Skip to content

Commit d012807

Browse files
dmytrodanilenkovmhalbritter
authored andcommitted
Add missing attributes to ServletRegistration annotation
See gh-45007 Signed-off-by: Dmytro Danilenkov <[email protected]>
1 parent 475a046 commit d012807

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
* @author Brian Clozel
6666
* @author Moritz Halbritter
6767
* @author Daeho Kwon
68+
* @author Dmytro Danilenkov
6869
* @since 1.4.0
6970
*/
7071
public class ServletContextInitializerBeans extends AbstractCollection<ServletContextInitializer> {
@@ -320,6 +321,10 @@ private void configureFromAnnotation(ServletRegistrationBean<Servlet> bean, Serv
320321
bean.setIgnoreRegistrationFailure(registration.ignoreRegistrationFailure());
321322
bean.setLoadOnStartup(registration.loadOnStartup());
322323
bean.setUrlMappings(Arrays.asList(registration.urlMappings()));
324+
for (WebInitParam param : registration.initParameters()) {
325+
bean.addInitParameter(param.name(), param.value());
326+
}
327+
bean.setMultipartConfig(new MultipartConfigElement(registration.multipartConfig()));
323328
}
324329

325330
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import java.lang.annotation.Target;
2424

2525
import jakarta.servlet.Servlet;
26+
import jakarta.servlet.annotation.MultipartConfig;
27+
import jakarta.servlet.annotation.WebInitParam;
2628

2729
import org.springframework.core.Ordered;
2830
import org.springframework.core.annotation.AliasFor;
@@ -33,6 +35,7 @@
3335
* annotation-based alternative to {@link ServletRegistrationBean}.
3436
*
3537
* @author Moritz Halbritter
38+
* @author Dmytro Danilenkov
3639
* @since 3.5.0
3740
* @see ServletRegistrationBean
3841
*/
@@ -87,4 +90,16 @@
8790
*/
8891
int loadOnStartup() default -1;
8992

93+
/**
94+
* Init parameters to set on the servlet (mirrors {@code @WebInitParam} usage).
95+
* @return array of {@link WebInitParam}
96+
*/
97+
WebInitParam[] initParameters() default {};
98+
99+
/**
100+
* Multipart configuration.
101+
* @return multipart config {@link MultipartConfig}
102+
*/
103+
MultipartConfig multipartConfig() default @MultipartConfig;
104+
90105
}

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import jakarta.servlet.ServletContext;
2828
import jakarta.servlet.ServletRequest;
2929
import jakarta.servlet.ServletResponse;
30+
import jakarta.servlet.annotation.MultipartConfig;
3031
import jakarta.servlet.annotation.WebInitParam;
3132
import jakarta.servlet.http.HttpServlet;
3233
import jakarta.servlet.http.HttpServletRequest;
@@ -51,6 +52,7 @@
5152
* @author Andy Wilkinson
5253
* @author Moritz Halbritter
5354
* @author Daeho Kwon
55+
* @author Dmytro Danilenkov
5456
*/
5557
class ServletContextInitializerBeansTests {
5658

@@ -207,6 +209,29 @@ void shouldApplyOrderFromOrderAttribute() {
207209
.isEqualTo(ServletConfigurationWithAnnotationAndOrder.ORDER));
208210
}
209211

212+
@Test
213+
void shouldApplyExtendedServletRegistrationAnnotation() {
214+
load(ServletConfigurationWithExtendedAttributes.class);
215+
ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
216+
this.context.getBeanFactory(), TestServletContextInitializer.class);
217+
assertThatSingleServletRegistration(initializerBeans, (bean) -> {
218+
assertThat(bean.getServletName()).isEqualTo("extended");
219+
assertThat(bean.getUrlMappings()).containsExactly("/extended/*");
220+
assertThat(bean.getInitParameters()).containsEntry("hello", "world").containsEntry("flag", "true");
221+
assertThat(bean.getMultipartConfig()).isNotNull();
222+
assertThat(bean.getMultipartConfig().getLocation()).isEqualTo("/tmp");
223+
assertThat(bean.getMultipartConfig().getMaxFileSize()).isEqualTo(1024);
224+
assertThat(bean.getMultipartConfig().getMaxRequestSize()).isEqualTo(4096);
225+
assertThat(bean.getMultipartConfig().getFileSizeThreshold()).isEqualTo(128);
226+
});
227+
228+
}
229+
230+
private void assertThatSingleServletRegistration(ServletContextInitializerBeans initializerBeans,
231+
ThrowingConsumer<ServletRegistrationBean<?>> code) {
232+
assertThatSingleRegistration(initializerBeans, ServletRegistrationBean.class, code::acceptThrows);
233+
}
234+
210235
private void load(Class<?>... configuration) {
211236
this.context = new AnnotationConfigApplicationContext(configuration);
212237
}
@@ -454,4 +479,19 @@ public void onStartup(ServletContext servletContext) {
454479

455480
}
456481

482+
@Configuration(proxyBeanMethods = false)
483+
static class ServletConfigurationWithExtendedAttributes {
484+
485+
@Bean
486+
@ServletRegistration(name = "extended", urlMappings = "/extended/*",
487+
initParameters = { @WebInitParam(name = "hello", value = "world"),
488+
@WebInitParam(name = "flag", value = "true") },
489+
multipartConfig = @MultipartConfig(location = "/tmp", maxFileSize = 1024, maxRequestSize = 4096,
490+
fileSizeThreshold = 128))
491+
TestServlet testServletWithInitParametersAndMultipart() {
492+
return new TestServlet();
493+
}
494+
495+
}
496+
457497
}

0 commit comments

Comments
 (0)