Skip to content

Add missing attributes to ServletRegistration annotation #45007

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@
import jakarta.servlet.Filter;
import jakarta.servlet.MultipartConfigElement;
import jakarta.servlet.Servlet;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebInitParam;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

Expand Down Expand Up @@ -63,6 +66,7 @@
* @author Phillip Webb
* @author Brian Clozel
* @author Moritz Halbritter
* @author Dmytro Danilenkov
* @since 1.4.0
*/
public class ServletContextInitializerBeans extends AbstractCollection<ServletContextInitializer> {
Expand Down Expand Up @@ -318,6 +322,15 @@ private void configureFromAnnotation(ServletRegistrationBean<Servlet> bean, Serv
bean.setIgnoreRegistrationFailure(registration.ignoreRegistrationFailure());
bean.setLoadOnStartup(registration.loadOnStartup());
bean.setUrlMappings(Arrays.asList(registration.urlMappings()));

for (WebInitParam param : registration.initParameters()) {
bean.addInitParameter(param.name(), param.value());
}

MultipartConfig multipart = registration.multipartConfig();
bean.setMultipartConfig(new MultipartConfigElement(multipart.location(), multipart.maxFileSize(),
multipart.maxRequestSize(), multipart.fileSizeThreshold()));

}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import java.lang.annotation.Target;

import jakarta.servlet.Servlet;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebInitParam;

import org.springframework.core.Ordered;
import org.springframework.core.annotation.AliasFor;
Expand All @@ -33,6 +35,7 @@
* annotation-based alternative to {@link ServletRegistrationBean}.
*
* @author Moritz Halbritter
* @author Dmytro Danilenkov
* @since 3.5.0
* @see ServletRegistrationBean
*/
Expand Down Expand Up @@ -87,4 +90,15 @@
*/
int loadOnStartup() default -1;

/**
* Init parameters to set on the servlet (mirrors {@code @WebInitParam} usage).
* @return array of {@link WebInitParam}
*/
WebInitParam[] initParameters() default {};

/**
* Multipart configuration.
*/
MultipartConfig multipartConfig() default @MultipartConfig;

}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
Expand All @@ -47,6 +49,7 @@
*
* @author Andy Wilkinson
* @author Moritz Halbritter
* @author Dmytro Danilenkov
*/
class ServletContextInitializerBeansTests {

Expand Down Expand Up @@ -195,6 +198,26 @@ void shouldApplyOrderFromOrderAttribute() {
.isEqualTo(ServletConfigurationWithAnnotationAndOrder.ORDER));
}

@Test
void shouldApplyExtendedServletRegistrationAnnotation() {
load(ServletConfigurationWithExtendedAttributes.class);
ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
this.context.getBeanFactory(), TestServletContextInitializer.class);

ServletRegistrationBean<?> bean = findServletRegistrationBeanByName(initializerBeans, "extended");

assertThat(bean.getServletName()).isEqualTo("extended");
assertThat(bean.getUrlMappings()).containsExactly("/extended/*");

assertThat(bean.getInitParameters()).containsEntry("hello", "world").containsEntry("flag", "true");

assertThat(bean.getMultipartConfig()).isNotNull();
assertThat(bean.getMultipartConfig().getLocation()).isEqualTo("/tmp");
assertThat(bean.getMultipartConfig().getMaxFileSize()).isEqualTo(1024);
assertThat(bean.getMultipartConfig().getMaxRequestSize()).isEqualTo(4096);
assertThat(bean.getMultipartConfig().getFileSizeThreshold()).isEqualTo(128);
}

private void load(Class<?>... configuration) {
this.context = new AnnotationConfigApplicationContext(configuration);
}
Expand Down Expand Up @@ -363,7 +386,6 @@ static class TestServlet extends HttpServlet implements ServletContextInitialize

@Override
public void onStartup(ServletContext servletContext) {

}

}
Expand All @@ -374,7 +396,6 @@ static class OrderedTestServlet extends HttpServlet implements ServletContextIni

@Override
public void onStartup(ServletContext servletContext) {

}

@Override
Expand All @@ -388,17 +409,14 @@ static class TestFilter implements Filter, ServletContextInitializer {

@Override
public void onStartup(ServletContext servletContext) {

}

@Override
public void init(FilterConfig filterConfig) {

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {

}

}
Expand All @@ -407,7 +425,6 @@ static class TestServletContextInitializer implements ServletContextInitializer

@Override
public void onStartup(ServletContext servletContext) {

}

}
Expand All @@ -416,9 +433,33 @@ static class OtherTestServletContextInitializer implements ServletContextInitial

@Override
public void onStartup(ServletContext servletContext) {
}

}

@Configuration(proxyBeanMethods = false)
static class ServletConfigurationWithExtendedAttributes {

@Bean
@ServletRegistration(name = "extended", urlMappings = "/extended/*",
initParameters = { @WebInitParam(name = "hello", value = "world"),
@WebInitParam(name = "flag", value = "true") },
multipartConfig = @MultipartConfig(location = "/tmp", maxFileSize = 1024, maxRequestSize = 4096,
fileSizeThreshold = 128))
TestServlet testServletWithInitParametersAndMultipart() {
return new TestServlet();
}

}

private ServletRegistrationBean<?> findServletRegistrationBeanByName(
ServletContextInitializerBeans initializerBeans, String name) {
return initializerBeans.stream()
.filter(ServletRegistrationBean.class::isInstance)
.map(ServletRegistrationBean.class::cast)
.filter((r) -> name.equals(r.getServletName()))
.findFirst()
.orElse(null);
}

}
Loading