Allow user to override static resource handler mappings

A new API in Spring allows us to check for existing mappings in the
resource handler registry
pull/79/merge
Dave Syer 11 years ago
parent 9df0c9eb4a
commit 64d9f4f18d

@ -175,9 +175,14 @@ public class WebMvcAutoConfiguration {
@Override @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!registry.hasMappingForPattern("/webjars/**")) {
registry.addResourceHandler("/webjars/**").addResourceLocations( registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/"); "classpath:/META-INF/resources/webjars/");
registry.addResourceHandler("/**").addResourceLocations(RESOURCE_LOCATIONS); }
if (!registry.hasMappingForPattern("/**")) {
registry.addResourceHandler("/**").addResourceLocations(
RESOURCE_LOCATIONS);
}
} }
@Override @Override

@ -40,6 +40,8 @@ import org.springframework.util.ReflectionUtils;
import org.springframework.web.servlet.HandlerAdapter; import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.View; import org.springframework.web.servlet.View;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler; import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
import org.springframework.web.servlet.view.AbstractView; import org.springframework.web.servlet.view.AbstractView;
@ -87,11 +89,43 @@ public class WebMvcAutoConfigurationTests {
} }
@Test @Test
@SuppressWarnings("unchecked")
public void resourceHandlerMapping() throws Exception { public void resourceHandlerMapping() throws Exception {
this.context = new AnnotationConfigEmbeddedWebApplicationContext(); this.context = new AnnotationConfigEmbeddedWebApplicationContext();
this.context.register(Config.class, WebMvcAutoConfiguration.class); this.context.register(Config.class, WebMvcAutoConfiguration.class);
this.context.refresh(); this.context.refresh();
Map<String, List<Resource>> mappingLocations = getMappingLocations();
assertThat(mappingLocations.get("/**").size(), equalTo(5));
assertThat(mappingLocations.get("/webjars/**").size(), equalTo(1));
assertThat(mappingLocations.get("/webjars/**").get(0),
equalTo((Resource) new ClassPathResource("/META-INF/resources/webjars/")));
}
@Test
public void resourceHandlerMappingOverrideWebjars() throws Exception {
this.context = new AnnotationConfigEmbeddedWebApplicationContext();
this.context.register(WebJars.class, Config.class, WebMvcAutoConfiguration.class);
this.context.refresh();
Map<String, List<Resource>> mappingLocations = getMappingLocations();
assertThat(mappingLocations.get("/webjars/**").size(), equalTo(1));
assertThat(mappingLocations.get("/webjars/**").get(0),
equalTo((Resource) new ClassPathResource("/foo/")));
}
@Test
public void resourceHandlerMappingOverrideAll() throws Exception {
this.context = new AnnotationConfigEmbeddedWebApplicationContext();
this.context.register(AllResources.class, Config.class,
WebMvcAutoConfiguration.class);
this.context.refresh();
Map<String, List<Resource>> mappingLocations = getMappingLocations();
assertThat(mappingLocations.get("/**").size(), equalTo(1));
assertThat(mappingLocations.get("/**").get(0),
equalTo((Resource) new ClassPathResource("/foo/")));
}
@SuppressWarnings("unchecked")
protected Map<String, List<Resource>> getMappingLocations()
throws IllegalAccessException {
SimpleUrlHandlerMapping mapping = (SimpleUrlHandlerMapping) this.context SimpleUrlHandlerMapping mapping = (SimpleUrlHandlerMapping) this.context
.getBean("resourceHandlerMapping"); .getBean("resourceHandlerMapping");
Field locationsField = ReflectionUtils.findField( Field locationsField = ReflectionUtils.findField(
@ -104,10 +138,7 @@ public class WebMvcAutoConfigurationTests {
mappingLocations.put(entry.getKey(), mappingLocations.put(entry.getKey(),
(List<Resource>) locationsField.get(handler)); (List<Resource>) locationsField.get(handler));
} }
assertThat(mappingLocations.get("/**").size(), equalTo(5)); return mappingLocations;
assertThat(mappingLocations.get("/webjars/**").size(), equalTo(1));
assertThat(mappingLocations.get("/webjars/**").get(0),
equalTo((Resource) new ClassPathResource("/META-INF/resources/webjars/")));
} }
@Configuration @Configuration
@ -128,6 +159,27 @@ public class WebMvcAutoConfigurationTests {
} }
@Configuration
protected static class WebJars extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/foo/");
}
}
@Configuration
protected static class AllResources extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/foo/");
}
}
@Configuration @Configuration
protected static class Config { protected static class Config {

Loading…
Cancel
Save