Skip to content

Commit e40c98e

Browse files
committed
Deprecate PrePostTemplateDefaults
Since there is nothing specific to configuring pre/post annotations, there is no need for the extra class. If a need like this does arise in the future, either AnnotationTemplateExpressionDefaults can be sub- classed, or it can have introduced a Map field holding custom properties. Issue gh-15286
1 parent 2c02d8a commit e40c98e

13 files changed

+173
-35
lines changed

config/src/main/java/org/springframework/security/config/annotation/method/configuration/PrePostMethodSecurityConfiguration.java

+9
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import org.springframework.security.authorization.method.PreFilterAuthorizationMethodInterceptor;
5252
import org.springframework.security.authorization.method.PrePostTemplateDefaults;
5353
import org.springframework.security.config.core.GrantedAuthorityDefaults;
54+
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
5455
import org.springframework.security.core.context.SecurityContextHolderStrategy;
5556
import org.springframework.util.function.SingletonSupplier;
5657

@@ -72,6 +73,7 @@ final class PrePostMethodSecurityConfiguration implements ImportAware, AopInfras
7273
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
7374
static MethodInterceptor preFilterAuthorizationMethodInterceptor(
7475
ObjectProvider<GrantedAuthorityDefaults> defaultsProvider,
76+
ObjectProvider<AnnotationTemplateExpressionDefaults> templateExpressionDefaultsProvider,
7577
ObjectProvider<PrePostTemplateDefaults> methodSecurityDefaultsProvider,
7678
ObjectProvider<MethodSecurityExpressionHandler> expressionHandlerProvider,
7779
ObjectProvider<SecurityContextHolderStrategy> strategyProvider,
@@ -80,6 +82,7 @@ static MethodInterceptor preFilterAuthorizationMethodInterceptor(
8082
PreFilterAuthorizationMethodInterceptor preFilter = new PreFilterAuthorizationMethodInterceptor();
8183
preFilter.setOrder(preFilter.getOrder() + configuration.interceptorOrderOffset);
8284
return new DeferringMethodInterceptor<>(preFilter, (f) -> {
85+
templateExpressionDefaultsProvider.ifAvailable(f::setTemplateDefaults);
8386
methodSecurityDefaultsProvider.ifAvailable(f::setTemplateDefaults);
8487
f.setExpressionHandler(expressionHandlerProvider
8588
.getIfAvailable(() -> defaultExpressionHandler(defaultsProvider, roleHierarchyProvider, context)));
@@ -91,6 +94,7 @@ static MethodInterceptor preFilterAuthorizationMethodInterceptor(
9194
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
9295
static MethodInterceptor preAuthorizeAuthorizationMethodInterceptor(
9396
ObjectProvider<GrantedAuthorityDefaults> defaultsProvider,
97+
ObjectProvider<AnnotationTemplateExpressionDefaults> templateExpressionDefaultsProvider,
9498
ObjectProvider<PrePostTemplateDefaults> methodSecurityDefaultsProvider,
9599
ObjectProvider<MethodSecurityExpressionHandler> expressionHandlerProvider,
96100
ObjectProvider<SecurityContextHolderStrategy> strategyProvider,
@@ -103,6 +107,7 @@ static MethodInterceptor preAuthorizeAuthorizationMethodInterceptor(
103107
.preAuthorize(manager(manager, registryProvider));
104108
preAuthorize.setOrder(preAuthorize.getOrder() + configuration.interceptorOrderOffset);
105109
return new DeferringMethodInterceptor<>(preAuthorize, (f) -> {
110+
templateExpressionDefaultsProvider.ifAvailable(manager::setTemplateDefaults);
106111
methodSecurityDefaultsProvider.ifAvailable(manager::setTemplateDefaults);
107112
manager.setExpressionHandler(expressionHandlerProvider
108113
.getIfAvailable(() -> defaultExpressionHandler(defaultsProvider, roleHierarchyProvider, context)));
@@ -115,6 +120,7 @@ static MethodInterceptor preAuthorizeAuthorizationMethodInterceptor(
115120
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
116121
static MethodInterceptor postAuthorizeAuthorizationMethodInterceptor(
117122
ObjectProvider<GrantedAuthorityDefaults> defaultsProvider,
123+
ObjectProvider<AnnotationTemplateExpressionDefaults> templateExpressionDefaultsProvider,
118124
ObjectProvider<PrePostTemplateDefaults> methodSecurityDefaultsProvider,
119125
ObjectProvider<MethodSecurityExpressionHandler> expressionHandlerProvider,
120126
ObjectProvider<SecurityContextHolderStrategy> strategyProvider,
@@ -127,6 +133,7 @@ static MethodInterceptor postAuthorizeAuthorizationMethodInterceptor(
127133
.postAuthorize(manager(manager, registryProvider));
128134
postAuthorize.setOrder(postAuthorize.getOrder() + configuration.interceptorOrderOffset);
129135
return new DeferringMethodInterceptor<>(postAuthorize, (f) -> {
136+
templateExpressionDefaultsProvider.ifAvailable(manager::setTemplateDefaults);
130137
methodSecurityDefaultsProvider.ifAvailable(manager::setTemplateDefaults);
131138
manager.setExpressionHandler(expressionHandlerProvider
132139
.getIfAvailable(() -> defaultExpressionHandler(defaultsProvider, roleHierarchyProvider, context)));
@@ -139,6 +146,7 @@ static MethodInterceptor postAuthorizeAuthorizationMethodInterceptor(
139146
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
140147
static MethodInterceptor postFilterAuthorizationMethodInterceptor(
141148
ObjectProvider<GrantedAuthorityDefaults> defaultsProvider,
149+
ObjectProvider<AnnotationTemplateExpressionDefaults> templateExpressionDefaultsProvider,
142150
ObjectProvider<PrePostTemplateDefaults> methodSecurityDefaultsProvider,
143151
ObjectProvider<MethodSecurityExpressionHandler> expressionHandlerProvider,
144152
ObjectProvider<SecurityContextHolderStrategy> strategyProvider,
@@ -147,6 +155,7 @@ static MethodInterceptor postFilterAuthorizationMethodInterceptor(
147155
PostFilterAuthorizationMethodInterceptor postFilter = new PostFilterAuthorizationMethodInterceptor();
148156
postFilter.setOrder(postFilter.getOrder() + configuration.interceptorOrderOffset);
149157
return new DeferringMethodInterceptor<>(postFilter, (f) -> {
158+
templateExpressionDefaultsProvider.ifAvailable(f::setTemplateDefaults);
150159
methodSecurityDefaultsProvider.ifAvailable(f::setTemplateDefaults);
151160
f.setExpressionHandler(expressionHandlerProvider
152161
.getIfAvailable(() -> defaultExpressionHandler(defaultsProvider, roleHierarchyProvider, context)));

config/src/test/java/org/springframework/security/config/annotation/method/configuration/PrePostMethodSecurityConfigurationTests.java

+53-26
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.aopalliance.intercept.MethodInvocation;
3434
import org.junit.jupiter.api.Test;
3535
import org.junit.jupiter.api.extension.ExtendWith;
36+
import org.junit.jupiter.params.ParameterizedTest;
37+
import org.junit.jupiter.params.provider.ValueSource;
3638

3739
import org.springframework.aop.Advisor;
3840
import org.springframework.aop.support.DefaultPointcutAdvisor;
@@ -78,6 +80,7 @@
7880
import org.springframework.security.config.test.SpringTestContextExtension;
7981
import org.springframework.security.config.test.SpringTestParentApplicationContextExecutionListener;
8082
import org.springframework.security.core.Authentication;
83+
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
8184
import org.springframework.security.core.context.SecurityContextHolderStrategy;
8285
import org.springframework.security.test.context.support.WithAnonymousUser;
8386
import org.springframework.security.test.context.support.WithMockUser;
@@ -607,69 +610,77 @@ public void allAnnotationsWhenAdviceAfterAllOffsetThenReturnsFilteredList() {
607610
assertThat(filtered).containsExactly("DoNotDrop");
608611
}
609612

610-
@Test
613+
@ParameterizedTest
614+
@ValueSource(classes = { LegacyMetaAnnotationPlaceholderConfig.class, MetaAnnotationPlaceholderConfig.class })
611615
@WithMockUser
612-
public void methodeWhenParameterizedPreAuthorizeMetaAnnotationThenPasses() {
613-
this.spring.register(MetaAnnotationPlaceholderConfig.class).autowire();
616+
public void methodeWhenParameterizedPreAuthorizeMetaAnnotationThenPasses(Class<?> config) {
617+
this.spring.register(config).autowire();
614618
MetaAnnotationService service = this.spring.getContext().getBean(MetaAnnotationService.class);
615619
assertThat(service.hasRole("USER")).isTrue();
616620
}
617621

618-
@Test
622+
@ParameterizedTest
623+
@ValueSource(classes = { LegacyMetaAnnotationPlaceholderConfig.class, MetaAnnotationPlaceholderConfig.class })
619624
@WithMockUser
620-
public void methodRoleWhenPreAuthorizeMetaAnnotationHardcodedParameterThenPasses() {
621-
this.spring.register(MetaAnnotationPlaceholderConfig.class).autowire();
625+
public void methodRoleWhenPreAuthorizeMetaAnnotationHardcodedParameterThenPasses(Class<?> config) {
626+
this.spring.register(config).autowire();
622627
MetaAnnotationService service = this.spring.getContext().getBean(MetaAnnotationService.class);
623628
assertThat(service.hasUserRole()).isTrue();
624629
}
625630

626-
@Test
627-
public void methodWhenParameterizedAnnotationThenFails() {
628-
this.spring.register(MetaAnnotationPlaceholderConfig.class).autowire();
631+
@ParameterizedTest
632+
@ValueSource(classes = { LegacyMetaAnnotationPlaceholderConfig.class, MetaAnnotationPlaceholderConfig.class })
633+
public void methodWhenParameterizedAnnotationThenFails(Class<?> config) {
634+
this.spring.register(config).autowire();
629635
MetaAnnotationService service = this.spring.getContext().getBean(MetaAnnotationService.class);
630636
assertThatExceptionOfType(IllegalArgumentException.class)
631637
.isThrownBy(service::placeholdersOnlyResolvedByMetaAnnotations);
632638
}
633639

634-
@Test
640+
@ParameterizedTest
641+
@ValueSource(classes = { LegacyMetaAnnotationPlaceholderConfig.class, MetaAnnotationPlaceholderConfig.class })
635642
@WithMockUser(authorities = "SCOPE_message:read")
636-
public void methodWhenMultiplePlaceholdersHasAuthorityThenPasses() {
637-
this.spring.register(MetaAnnotationPlaceholderConfig.class).autowire();
643+
public void methodWhenMultiplePlaceholdersHasAuthorityThenPasses(Class<?> config) {
644+
this.spring.register(config).autowire();
638645
MetaAnnotationService service = this.spring.getContext().getBean(MetaAnnotationService.class);
639646
assertThat(service.readMessage()).isEqualTo("message");
640647
}
641648

642-
@Test
649+
@ParameterizedTest
650+
@ValueSource(classes = { LegacyMetaAnnotationPlaceholderConfig.class, MetaAnnotationPlaceholderConfig.class })
643651
@WithMockUser(roles = "ADMIN")
644-
public void methodWhenMultiplePlaceholdersHasRoleThenPasses() {
645-
this.spring.register(MetaAnnotationPlaceholderConfig.class).autowire();
652+
public void methodWhenMultiplePlaceholdersHasRoleThenPasses(Class<?> config) {
653+
this.spring.register(config).autowire();
646654
MetaAnnotationService service = this.spring.getContext().getBean(MetaAnnotationService.class);
647655
assertThat(service.readMessage()).isEqualTo("message");
648656
}
649657

650-
@Test
658+
@ParameterizedTest
659+
@ValueSource(classes = { LegacyMetaAnnotationPlaceholderConfig.class, MetaAnnotationPlaceholderConfig.class })
651660
@WithMockUser
652-
public void methodWhenPostAuthorizeMetaAnnotationThenAuthorizes() {
653-
this.spring.register(MetaAnnotationPlaceholderConfig.class).autowire();
661+
public void methodWhenPostAuthorizeMetaAnnotationThenAuthorizes(Class<?> config) {
662+
this.spring.register(config).autowire();
654663
MetaAnnotationService service = this.spring.getContext().getBean(MetaAnnotationService.class);
655664
service.startsWithDave("daveMatthews");
656665
assertThatExceptionOfType(AccessDeniedException.class)
657666
.isThrownBy(() -> service.startsWithDave("jenniferHarper"));
658667
}
659668

660-
@Test
669+
@ParameterizedTest
670+
@ValueSource(classes = { LegacyMetaAnnotationPlaceholderConfig.class, MetaAnnotationPlaceholderConfig.class })
661671
@WithMockUser
662-
public void methodWhenPreFilterMetaAnnotationThenFilters() {
663-
this.spring.register(MetaAnnotationPlaceholderConfig.class).autowire();
672+
public void methodWhenPreFilterMetaAnnotationThenFilters(Class<?> config) {
673+
this.spring.register(config).autowire();
664674
MetaAnnotationService service = this.spring.getContext().getBean(MetaAnnotationService.class);
665675
assertThat(service.parametersContainDave(new ArrayList<>(List.of("dave", "carla", "vanessa", "paul"))))
666676
.containsExactly("dave");
667677
}
668678

669-
@Test
679+
@ParameterizedTest
680+
@ValueSource(classes = { LegacyMetaAnnotationPlaceholderConfig.class, MetaAnnotationPlaceholderConfig.class })
670681
@WithMockUser
671-
public void methodWhenPostFilterMetaAnnotationThenFilters() {
672-
this.spring.register(MetaAnnotationPlaceholderConfig.class).autowire();
682+
public void methodWhenPostFilterMetaAnnotationThenFilters(Class<?> config) {
683+
this.spring.register(config).autowire();
673684
MetaAnnotationService service = this.spring.getContext().getBean(MetaAnnotationService.class);
674685
assertThat(service.resultsContainDave(new ArrayList<>(List.of("dave", "carla", "vanessa", "paul"))))
675686
.containsExactly("dave");
@@ -827,7 +838,7 @@ void preAuthorizeWhenDeniedAndHandlerWithCustomAnnotationInClassThenHandlerCanUs
827838
@WithMockUser
828839
void postAuthorizeWhenNullDeniedMetaAnnotationThanWorks() {
829840
this.spring
830-
.register(MethodSecurityServiceEnabledConfig.class, MetaAnnotationPlaceholderConfig.class,
841+
.register(MethodSecurityServiceEnabledConfig.class, LegacyMetaAnnotationPlaceholderConfig.class,
831842
MethodSecurityService.NullPostProcessor.class)
832843
.autowire();
833844
MethodSecurityService service = this.spring.getContext().getBean(MethodSecurityService.class);
@@ -1268,7 +1279,7 @@ Authz authz() {
12681279

12691280
@Configuration
12701281
@EnableMethodSecurity
1271-
static class MetaAnnotationPlaceholderConfig {
1282+
static class LegacyMetaAnnotationPlaceholderConfig {
12721283

12731284
@Bean
12741285
PrePostTemplateDefaults methodSecurityDefaults() {
@@ -1282,6 +1293,22 @@ MetaAnnotationService metaAnnotationService() {
12821293

12831294
}
12841295

1296+
@Configuration
1297+
@EnableMethodSecurity
1298+
static class MetaAnnotationPlaceholderConfig {
1299+
1300+
@Bean
1301+
AnnotationTemplateExpressionDefaults methodSecurityDefaults() {
1302+
return new AnnotationTemplateExpressionDefaults();
1303+
}
1304+
1305+
@Bean
1306+
MetaAnnotationService metaAnnotationService() {
1307+
return new MetaAnnotationService();
1308+
}
1309+
1310+
}
1311+
12851312
static class MetaAnnotationService {
12861313

12871314
@RequireRole(role = "#role")

core/src/main/java/org/springframework/security/authorization/method/AbstractExpressionAttributeRegistry.java

+10
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.lang.NonNull;
2727
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
2828
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
29+
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
2930
import org.springframework.util.Assert;
3031

3132
/**
@@ -76,6 +77,15 @@ void setExpressionHandler(MethodSecurityExpressionHandler expressionHandler) {
7677
this.expressionHandler = expressionHandler;
7778
}
7879

80+
@Deprecated
81+
void setTemplateDefaults(PrePostTemplateDefaults defaults) {
82+
AnnotationTemplateExpressionDefaults adapter = new AnnotationTemplateExpressionDefaults();
83+
adapter.setIgnoreUnknown(defaults.isIgnoreUnknown());
84+
setTemplateDefaults(adapter);
85+
}
86+
87+
abstract void setTemplateDefaults(AnnotationTemplateExpressionDefaults adapter);
88+
7989
/**
8090
* Subclasses should implement this method to provide the non-null
8191
* {@link ExpressionAttribute} for the method and the target class.

core/src/main/java/org/springframework/security/authorization/method/PostAuthorizeAuthorizationManager.java

+16
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.security.authorization.AuthorizationManager;
2929
import org.springframework.security.authorization.AuthorizationResult;
3030
import org.springframework.security.core.Authentication;
31+
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
3132

3233
/**
3334
* An {@link AuthorizationManager} which can determine if an {@link Authentication} may
@@ -57,11 +58,26 @@ public void setExpressionHandler(MethodSecurityExpressionHandler expressionHandl
5758
* not be resolved.
5859
* @param defaults - whether to resolve pre/post-authorization templates parameters
5960
* @since 6.3
61+
* @deprecated Please use
62+
* {@link #setTemplateDefaults(AnnotationTemplateExpressionDefaults)} instead
6063
*/
64+
@Deprecated
6165
public void setTemplateDefaults(PrePostTemplateDefaults defaults) {
6266
this.registry.setTemplateDefaults(defaults);
6367
}
6468

69+
/**
70+
* Configure pre/post-authorization template resolution
71+
* <p>
72+
* By default, this value is <code>null</code>, which indicates that templates should
73+
* not be resolved.
74+
* @param defaults - whether to resolve pre/post-authorization templates parameters
75+
* @since 6.4
76+
*/
77+
public void setTemplateDefaults(AnnotationTemplateExpressionDefaults defaults) {
78+
this.registry.setTemplateDefaults(defaults);
79+
}
80+
6581
/**
6682
* Invokes
6783
* {@link PostAuthorizeExpressionAttributeRegistry#setApplicationContext(ApplicationContext)}

core/src/main/java/org/springframework/security/authorization/method/PostAuthorizeExpressionAttributeRegistry.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.security.access.prepost.PostAuthorize;
2828
import org.springframework.security.core.annotation.AnnotationSynthesizer;
2929
import org.springframework.security.core.annotation.AnnotationSynthesizers;
30+
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
3031
import org.springframework.util.Assert;
3132

3233
/**
@@ -90,7 +91,7 @@ void setApplicationContext(ApplicationContext context) {
9091
this.handlerResolver = (clazz) -> resolveHandler(context, clazz);
9192
}
9293

93-
void setTemplateDefaults(PrePostTemplateDefaults templateDefaults) {
94+
void setTemplateDefaults(AnnotationTemplateExpressionDefaults templateDefaults) {
9495
this.postAuthorizeSynthesizer = AnnotationSynthesizers.requireUnique(PostAuthorize.class, templateDefaults);
9596
}
9697

core/src/main/java/org/springframework/security/authorization/method/PostFilterAuthorizationMethodInterceptor.java

+15
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.security.access.prepost.PostFilter;
2929
import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException;
3030
import org.springframework.security.core.Authentication;
31+
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
3132
import org.springframework.security.core.context.SecurityContextHolder;
3233
import org.springframework.security.core.context.SecurityContextHolderStrategy;
3334

@@ -73,11 +74,25 @@ public void setExpressionHandler(MethodSecurityExpressionHandler expressionHandl
7374
* not be resolved.
7475
* @param defaults - whether to resolve pre/post-authorization templates parameters
7576
* @since 6.3
77+
* @deprecated Please use {@link AnnotationTemplateExpressionDefaults} instead
7678
*/
79+
@Deprecated
7780
public void setTemplateDefaults(PrePostTemplateDefaults defaults) {
7881
this.registry.setTemplateDefaults(defaults);
7982
}
8083

84+
/**
85+
* Configure pre/post-authorization template resolution
86+
* <p>
87+
* By default, this value is <code>null</code>, which indicates that templates should
88+
* not be resolved.
89+
* @param defaults - whether to resolve pre/post-authorization templates parameters
90+
* @since 6.4
91+
*/
92+
public void setTemplateDefaults(AnnotationTemplateExpressionDefaults defaults) {
93+
this.registry.setTemplateDefaults(defaults);
94+
}
95+
8196
/**
8297
* {@inheritDoc}
8398
*/

core/src/main/java/org/springframework/security/authorization/method/PostFilterExpressionAttributeRegistry.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.security.access.prepost.PostFilter;
2424
import org.springframework.security.core.annotation.AnnotationSynthesizer;
2525
import org.springframework.security.core.annotation.AnnotationSynthesizers;
26+
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
2627

2728
/**
2829
* For internal use only, as this contract is likely to change.
@@ -47,7 +48,7 @@ ExpressionAttribute resolveAttribute(Method method, Class<?> targetClass) {
4748
return new ExpressionAttribute(postFilterExpression);
4849
}
4950

50-
void setTemplateDefaults(PrePostTemplateDefaults defaults) {
51+
void setTemplateDefaults(AnnotationTemplateExpressionDefaults defaults) {
5152
this.synthesizer = AnnotationSynthesizers.requireUnique(PostFilter.class, defaults);
5253
}
5354

core/src/main/java/org/springframework/security/authorization/method/PreAuthorizeAuthorizationManager.java

+16
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.security.authorization.AuthorizationManager;
2929
import org.springframework.security.authorization.AuthorizationResult;
3030
import org.springframework.security.core.Authentication;
31+
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
3132

3233
/**
3334
* An {@link AuthorizationManager} which can determine if an {@link Authentication} may
@@ -57,11 +58,26 @@ public void setExpressionHandler(MethodSecurityExpressionHandler expressionHandl
5758
* not be resolved.
5859
* @param defaults - whether to resolve pre/post-authorization templates parameters
5960
* @since 6.3
61+
* @deprecated Please use
62+
* {@link #setTemplateDefaults(AnnotationTemplateExpressionDefaults)} instead
6063
*/
64+
@Deprecated
6165
public void setTemplateDefaults(PrePostTemplateDefaults defaults) {
6266
this.registry.setTemplateDefaults(defaults);
6367
}
6468

69+
/**
70+
* Configure pre/post-authorization template resolution
71+
* <p>
72+
* By default, this value is <code>null</code>, which indicates that templates should
73+
* not be resolved.
74+
* @param defaults - whether to resolve pre/post-authorization templates parameters
75+
* @since 6.4
76+
*/
77+
public void setTemplateDefaults(AnnotationTemplateExpressionDefaults defaults) {
78+
this.registry.setTemplateDefaults(defaults);
79+
}
80+
6581
public void setApplicationContext(ApplicationContext context) {
6682
this.registry.setApplicationContext(context);
6783
}

0 commit comments

Comments
 (0)