Keep a live reference of protocol resolvers rather than copying them
This commit makes sure that any subsequent call on addProtocolResolver on the context will impact the ResourceLoader implementation that DevTools sets on the context. This makes sure that any custom ProtocolResolver that is set later in the lifecycle is taken into account. Closes gh-17214
This commit is contained in:
@@ -134,6 +134,18 @@ public class ClassLoaderFilesResourcePatternResolverTests {
|
||||
verify(resolver).resolve(eq("foo:some-file.txt"), any(ResourceLoader.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void customProtocolResolverRegisteredAfterCreationIsUsedInNonWebApplication() {
|
||||
GenericApplicationContext context = new GenericApplicationContext();
|
||||
Resource resource = mock(Resource.class);
|
||||
this.resolver = new ClassLoaderFilesResourcePatternResolver(context, this.files);
|
||||
ProtocolResolver resolver = mockProtocolResolver("foo:some-file.txt", resource);
|
||||
context.addProtocolResolver(resolver);
|
||||
Resource actual = this.resolver.getResource("foo:some-file.txt");
|
||||
assertThat(actual).isSameAs(resource);
|
||||
verify(resolver).resolve(eq("foo:some-file.txt"), any(ResourceLoader.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void customResourceLoaderIsUsedInWebApplication() {
|
||||
GenericWebApplicationContext context = new GenericWebApplicationContext(new MockServletContext());
|
||||
@@ -156,6 +168,18 @@ public class ClassLoaderFilesResourcePatternResolverTests {
|
||||
verify(resolver).resolve(eq("foo:some-file.txt"), any(ResourceLoader.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void customProtocolResolverRegisteredAfterCreationIsUsedInWebApplication() {
|
||||
GenericWebApplicationContext context = new GenericWebApplicationContext(new MockServletContext());
|
||||
Resource resource = mock(Resource.class);
|
||||
this.resolver = new ClassLoaderFilesResourcePatternResolver(context, this.files);
|
||||
ProtocolResolver resolver = mockProtocolResolver("foo:some-file.txt", resource);
|
||||
context.addProtocolResolver(resolver);
|
||||
Resource actual = this.resolver.getResource("foo:some-file.txt");
|
||||
assertThat(actual).isSameAs(resource);
|
||||
verify(resolver).resolve(eq("foo:some-file.txt"), any(ResourceLoader.class));
|
||||
}
|
||||
|
||||
private ProtocolResolver mockProtocolResolver(String path, Resource resource) {
|
||||
ProtocolResolver resolver = mock(ProtocolResolver.class);
|
||||
given(resolver.resolve(eq(path), any(ResourceLoader.class))).willReturn(resource);
|
||||
|
||||
Reference in New Issue
Block a user