1
1
/*
2
- * Copyright 2012-2024 the original author or authors.
2
+ * Copyright 2012-2025 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -132,8 +132,8 @@ public static ResourceLoader get(ResourceLoader resourceLoader) {
132
132
* class loader at the time this call is made.
133
133
* @param resourceLoader the delegate resource loader
134
134
* @param preferFileResolution if file based resolution is preferred over
135
- * {@code ServletContextResource} or {@link ClassPathResource} when no resource prefix
136
- * is provided.
135
+ * {@code ServletContextResource}, {@code FilteredReactiveWebContextResource} or
136
+ * {@link ClassPathResource} when no resource prefix is provided.
137
137
* @return a {@link ResourceLoader} instance
138
138
* @since 3.4.1
139
139
*/
@@ -212,28 +212,32 @@ private static class ProtocolResolvingResourceLoader implements ResourceLoader {
212
212
213
213
private static final String SERVLET_CONTEXT_RESOURCE_CLASS_NAME = "org.springframework.web.context.support.ServletContextResource" ;
214
214
215
+ private static final String FILTERED_REACTIVE_WEB_CONTEXT_RESOURCE_CLASS_NAME = "org.springframework.boot.web.reactive.context.FilteredReactiveWebContextResource" ;
216
+
215
217
private final ResourceLoader resourceLoader ;
216
218
217
219
private final List <ProtocolResolver > protocolResolvers ;
218
220
219
221
private final boolean preferFileResolution ;
220
222
221
- private Class <?> servletContextResourceClass ;
223
+ private final Class <?> servletContextResourceClass ;
224
+
225
+ private final Class <?> filteredReactiveWebContextResourceClass ;
222
226
223
227
ProtocolResolvingResourceLoader (ResourceLoader resourceLoader , List <ProtocolResolver > protocolResolvers ,
224
228
boolean preferFileResolution ) {
225
229
this .resourceLoader = resourceLoader ;
226
230
this .protocolResolvers = protocolResolvers ;
227
231
this .preferFileResolution = preferFileResolution ;
228
- this .servletContextResourceClass = resolveServletContextResourceClass (
232
+ this .servletContextResourceClass = resolveClassName ( SERVLET_CONTEXT_RESOURCE_CLASS_NAME ,
229
233
resourceLoader .getClass ().getClassLoader ());
234
+ this .filteredReactiveWebContextResourceClass = resolveClassName (
235
+ FILTERED_REACTIVE_WEB_CONTEXT_RESOURCE_CLASS_NAME , resourceLoader .getClass ().getClassLoader ());
230
236
}
231
237
232
- private static Class <?> resolveServletContextResourceClass (ClassLoader classLoader ) {
233
- if (!ClassUtils .isPresent (SERVLET_CONTEXT_RESOURCE_CLASS_NAME , classLoader )) {
234
- return null ;
235
- }
236
- return ClassUtils .resolveClassName (SERVLET_CONTEXT_RESOURCE_CLASS_NAME , classLoader );
238
+ @ Override
239
+ public ClassLoader getClassLoader () {
240
+ return this .resourceLoader .getClassLoader ();
237
241
}
238
242
239
243
@ Override
@@ -247,24 +251,38 @@ public Resource getResource(String location) {
247
251
}
248
252
}
249
253
Resource resource = this .resourceLoader .getResource (location );
250
- if (this .preferFileResolution
251
- && (isClassPathResourceByPath (location , resource ) || isServletResource (resource ))) {
252
- resource = new ApplicationResource (location );
254
+ if (shouldUseFileResolution (location , resource )) {
255
+ return new ApplicationResource (location );
253
256
}
254
257
return resource ;
255
258
}
256
259
260
+ private boolean shouldUseFileResolution (String location , Resource resource ) {
261
+ if (!this .preferFileResolution ) {
262
+ return false ;
263
+ }
264
+ return isClassPathResourceByPath (location , resource ) || isServletContextResource (resource )
265
+ || isFilteredReactiveWebContextResource (resource );
266
+ }
267
+
257
268
private boolean isClassPathResourceByPath (String location , Resource resource ) {
258
269
return (resource instanceof ClassPathResource ) && !location .startsWith (CLASSPATH_URL_PREFIX );
259
270
}
260
271
261
- private boolean isServletResource (Resource resource ) {
262
- return this .servletContextResourceClass != null && this .servletContextResourceClass .isInstance (resource );
272
+ private boolean isServletContextResource (Resource resource ) {
273
+ return ( this .servletContextResourceClass != null ) && this .servletContextResourceClass .isInstance (resource );
263
274
}
264
275
265
- @ Override
266
- public ClassLoader getClassLoader () {
267
- return this .resourceLoader .getClassLoader ();
276
+ private boolean isFilteredReactiveWebContextResource (Resource resource ) {
277
+ return (this .filteredReactiveWebContextResourceClass != null )
278
+ && this .filteredReactiveWebContextResourceClass .isInstance (resource );
279
+ }
280
+
281
+ private static Class <?> resolveClassName (String clazz , ClassLoader classLoader ) {
282
+ if (!ClassUtils .isPresent (clazz , classLoader )) {
283
+ return null ;
284
+ }
285
+ return ClassUtils .resolveClassName (clazz , classLoader );
268
286
}
269
287
270
288
}
0 commit comments