2121import java .util .List ;
2222import java .util .function .Consumer ;
2323
24+ import jakarta .validation .Validator ;
2425import org .junit .jupiter .api .Test ;
2526
2627import org .springframework .aot .hint .MemberCategory ;
2728import org .springframework .aot .hint .RuntimeHints ;
2829import org .springframework .aot .hint .predicate .RuntimeHintsPredicates ;
30+ import org .springframework .beans .factory .ObjectProvider ;
31+ import org .springframework .beans .factory .config .BeanDefinition ;
2932import org .springframework .boot .actuate .endpoint .EndpointId ;
3033import org .springframework .boot .actuate .endpoint .annotation .DiscoveredEndpoint ;
3134import org .springframework .boot .actuate .endpoint .annotation .Endpoint ;
3235import org .springframework .boot .actuate .endpoint .annotation .ReadOperation ;
33- import org .springframework .boot .autoconfigure .AutoConfigurations ;
3436import org .springframework .boot .test .context .assertj .AssertableApplicationContext ;
3537import org .springframework .boot .test .context .runner .ApplicationContextRunner ;
3638import org .springframework .boot .test .context .runner .ContextConsumer ;
37- import org .springframework .boot .validation .autoconfigure .ValidationAutoConfiguration ;
39+ import org .springframework .context .ApplicationContext ;
40+ import org .springframework .context .annotation .Bean ;
3841import org .springframework .context .annotation .Configuration ;
3942import org .springframework .context .annotation .Import ;
43+ import org .springframework .context .annotation .Role ;
44+ import org .springframework .util .ClassUtils ;
4045import org .springframework .validation .annotation .Validated ;
46+ import org .springframework .validation .beanvalidation .LocalValidatorFactoryBean ;
47+ import org .springframework .validation .beanvalidation .MethodValidationPostProcessor ;
4148
4249import static org .assertj .core .api .Assertions .assertThat ;
4350import static org .assertj .core .api .Assertions .assertThatIllegalStateException ;
@@ -68,21 +75,22 @@ void getEndpointsShouldIncludeControllerEndpoints() {
6875 ExposableControllerEndpoint endpoint = endpoints .iterator ().next ();
6976 assertThat (endpoint .getEndpointId ()).isEqualTo (EndpointId .of ("testcontroller" ));
7077 assertThat (endpoint .getController ()).isInstanceOf (TestControllerEndpoint .class );
78+ assertThat (ClassUtils .isCglibProxy (endpoint .getController ())).isFalse ();
7179 assertThat (endpoint ).isInstanceOf (DiscoveredEndpoint .class );
7280 }));
7381 }
7482
7583 @ Test
7684 void getEndpointsShouldDiscoverProxyControllerEndpoints () {
77- this .contextRunner .withUserConfiguration (TestProxyControllerEndpoint .class )
78- .withConfiguration (AutoConfigurations .of (ValidationAutoConfiguration .class ))
85+ this .contextRunner .withUserConfiguration (ProxyBeanConfiguration .class , TestProxyControllerEndpoint .class )
7986 .run (assertDiscoverer ((discoverer ) -> {
8087 Collection <ExposableControllerEndpoint > endpoints = discoverer .getEndpoints ();
8188 assertThat (endpoints ).hasSize (1 );
8289 ExposableControllerEndpoint endpoint = endpoints .iterator ().next ();
8390 assertThat (endpoint .getEndpointId ()).isEqualTo (EndpointId .of ("testcontroller" ));
8491 assertThat (endpoint .getController ()).isInstanceOf (TestProxyControllerEndpoint .class );
8592 assertThat (endpoint ).isInstanceOf (DiscoveredEndpoint .class );
93+ assertThat (ClassUtils .isCglibProxy (endpoint .getController ())).isTrue ();
8694 }));
8795 }
8896
@@ -95,19 +103,20 @@ void getEndpointsShouldIncludeRestControllerEndpoints() {
95103 ExposableControllerEndpoint endpoint = endpoints .iterator ().next ();
96104 assertThat (endpoint .getEndpointId ()).isEqualTo (EndpointId .of ("testrestcontroller" ));
97105 assertThat (endpoint .getController ()).isInstanceOf (TestRestControllerEndpoint .class );
106+ assertThat (ClassUtils .isCglibProxy (endpoint .getController ())).isFalse ();
98107 }));
99108 }
100109
101110 @ Test
102111 void getEndpointsShouldDiscoverProxyRestControllerEndpoints () {
103- this .contextRunner .withUserConfiguration (TestProxyRestControllerEndpoint .class )
104- .withConfiguration (AutoConfigurations .of (ValidationAutoConfiguration .class ))
112+ this .contextRunner .withUserConfiguration (ProxyBeanConfiguration .class , TestProxyRestControllerEndpoint .class )
105113 .run (assertDiscoverer ((discoverer ) -> {
106114 Collection <ExposableControllerEndpoint > endpoints = discoverer .getEndpoints ();
107115 assertThat (endpoints ).hasSize (1 );
108116 ExposableControllerEndpoint endpoint = endpoints .iterator ().next ();
109117 assertThat (endpoint .getEndpointId ()).isEqualTo (EndpointId .of ("testrestcontroller" ));
110118 assertThat (endpoint .getController ()).isInstanceOf (TestProxyRestControllerEndpoint .class );
119+ assertThat (ClassUtils .isCglibProxy (endpoint .getController ())).isTrue ();
111120 assertThat (endpoint ).isInstanceOf (DiscoveredEndpoint .class );
112121 }));
113122 }
@@ -197,4 +206,22 @@ String read() {
197206
198207 }
199208
209+ static class ProxyBeanConfiguration {
210+
211+ @ Bean
212+ @ Role (BeanDefinition .ROLE_INFRASTRUCTURE )
213+ static LocalValidatorFactoryBean defaultValidator (ApplicationContext applicationContext ) {
214+ return new LocalValidatorFactoryBean ();
215+ }
216+
217+ @ Bean
218+ static MethodValidationPostProcessor methodValidationPostProcessor (ObjectProvider <Validator > validator ) {
219+ MethodValidationPostProcessor processor = new MethodValidationPostProcessor ();
220+ processor .setProxyTargetClass (true );
221+ processor .setValidatorProvider (validator );
222+ return processor ;
223+ }
224+
225+ }
226+
200227}
0 commit comments