Polish "Register controller advices to RSocket messaging"
See gh-45360
This commit is contained in:
		
							parent
							
								
									94fce6f689
								
							
						
					
					
						commit
						485180df4f
					
				|  | @ -69,6 +69,8 @@ Spring Boot will auto-configure the Spring Messaging infrastructure for RSocket. | ||||||
| 
 | 
 | ||||||
| This means that Spring Boot will create a javadoc:org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler[] bean that will handle RSocket requests to your application. | This means that Spring Boot will create a javadoc:org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler[] bean that will handle RSocket requests to your application. | ||||||
| 
 | 
 | ||||||
|  | TIP: You can use {url-spring-framework-docs}/web/webmvc/mvc-controller/ann-advice.html[`@ControllerAdvice`] to handle exceptions. | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| [[messaging.rsocket.requester]] | [[messaging.rsocket.requester]] | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; | ||||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | ||||||
| import org.springframework.context.ApplicationContext; | import org.springframework.context.ApplicationContext; | ||||||
| import org.springframework.context.annotation.Bean; | import org.springframework.context.annotation.Bean; | ||||||
|  | import org.springframework.context.annotation.Configuration; | ||||||
| import org.springframework.messaging.handler.MessagingAdviceBean; | import org.springframework.messaging.handler.MessagingAdviceBean; | ||||||
| import org.springframework.messaging.rsocket.RSocketRequester; | import org.springframework.messaging.rsocket.RSocketRequester; | ||||||
| import org.springframework.messaging.rsocket.RSocketStrategies; | import org.springframework.messaging.rsocket.RSocketStrategies; | ||||||
|  | @ -38,6 +39,7 @@ import org.springframework.web.method.ControllerAdviceBean; | ||||||
|  * |  * | ||||||
|  * @author Brian Clozel |  * @author Brian Clozel | ||||||
|  * @author Dmitry Sulman |  * @author Dmitry Sulman | ||||||
|  |  * @author Stephane Nicoll | ||||||
|  * @since 4.0.0 |  * @since 4.0.0 | ||||||
|  */ |  */ | ||||||
| @AutoConfiguration(after = RSocketStrategiesAutoConfiguration.class) | @AutoConfiguration(after = RSocketStrategiesAutoConfiguration.class) | ||||||
|  | @ -51,12 +53,39 @@ public final class RSocketMessagingAutoConfiguration { | ||||||
| 		RSocketMessageHandler messageHandler = new RSocketMessageHandler(); | 		RSocketMessageHandler messageHandler = new RSocketMessageHandler(); | ||||||
| 		messageHandler.setRSocketStrategies(rSocketStrategies); | 		messageHandler.setRSocketStrategies(rSocketStrategies); | ||||||
| 		customizers.orderedStream().forEach((customizer) -> customizer.customize(messageHandler)); | 		customizers.orderedStream().forEach((customizer) -> customizer.customize(messageHandler)); | ||||||
| 		ControllerAdviceBean.findAnnotatedBeans(context) | 
 | ||||||
| 			.forEach((controllerAdviceBean) -> messageHandler |  | ||||||
| 				.registerMessagingAdvice(new ControllerAdviceBeanWrapper(controllerAdviceBean))); |  | ||||||
| 		return messageHandler; | 		return messageHandler; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	@Configuration(proxyBeanMethods = false) | ||||||
|  | 	@ConditionalOnClass(ControllerAdviceBean.class) | ||||||
|  | 	static class MessagingAdviceConfiguration { | ||||||
|  | 
 | ||||||
|  | 		@Bean | ||||||
|  | 		MessagingAdviceRSocketMessageHandlerCustomizer messagingAdviceRSocketMessageHandlerCustomizer( | ||||||
|  | 				ApplicationContext applicationContext) { | ||||||
|  | 			return new MessagingAdviceRSocketMessageHandlerCustomizer(applicationContext); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	static final class MessagingAdviceRSocketMessageHandlerCustomizer implements RSocketMessageHandlerCustomizer { | ||||||
|  | 
 | ||||||
|  | 		private final ApplicationContext applicationContext; | ||||||
|  | 
 | ||||||
|  | 		MessagingAdviceRSocketMessageHandlerCustomizer(ApplicationContext applicationContext) { | ||||||
|  | 			this.applicationContext = applicationContext; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void customize(RSocketMessageHandler messageHandler) { | ||||||
|  | 			ControllerAdviceBean.findAnnotatedBeans(this.applicationContext) | ||||||
|  | 				.forEach((controllerAdviceBean) -> messageHandler | ||||||
|  | 					.registerMessagingAdvice(new ControllerAdviceBeanWrapper(controllerAdviceBean))); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	private static final class ControllerAdviceBeanWrapper implements MessagingAdviceBean { | 	private static final class ControllerAdviceBeanWrapper implements MessagingAdviceBean { | ||||||
| 
 | 
 | ||||||
| 		private final ControllerAdviceBean adviceBean; | 		private final ControllerAdviceBean adviceBean; | ||||||
|  |  | ||||||
|  | @ -89,15 +89,14 @@ class RSocketMessagingAutoConfigurationTests { | ||||||
| 	void shouldRegisterControllerAdvice() { | 	void shouldRegisterControllerAdvice() { | ||||||
| 		this.contextRunner.withBean(TestControllerAdvice.class).withBean(TestController.class).run((context) -> { | 		this.contextRunner.withBean(TestControllerAdvice.class).withBean(TestController.class).run((context) -> { | ||||||
| 			RSocketMessageHandler handler = context.getBean(RSocketMessageHandler.class); | 			RSocketMessageHandler handler = context.getBean(RSocketMessageHandler.class); | ||||||
| 			TestControllerAdvice controllerAdvice = context.getBean(TestControllerAdvice.class); |  | ||||||
| 
 |  | ||||||
| 			MessageHeaderAccessor headers = new MessageHeaderAccessor(); | 			MessageHeaderAccessor headers = new MessageHeaderAccessor(); | ||||||
| 			RouteMatcher.Route route = handler.getRouteMatcher().parseRoute("exception"); | 			RouteMatcher.Route route = handler.getRouteMatcher().parseRoute("exception"); | ||||||
| 			headers.setHeader(DestinationPatternsMessageCondition.LOOKUP_DESTINATION_HEADER, route); | 			headers.setHeader(DestinationPatternsMessageCondition.LOOKUP_DESTINATION_HEADER, route); | ||||||
| 			headers.setHeader(RSocketFrameTypeMessageCondition.FRAME_TYPE_HEADER, FrameType.REQUEST_FNF); | 			headers.setHeader(RSocketFrameTypeMessageCondition.FRAME_TYPE_HEADER, FrameType.REQUEST_FNF); | ||||||
| 			Message<?> message = MessageBuilder.createMessage(Mono.empty(), headers.getMessageHeaders()); | 			Message<?> message = MessageBuilder.createMessage(Mono.empty(), headers.getMessageHeaders()); | ||||||
|  | 
 | ||||||
| 			StepVerifier.create(handler.handleMessage(message)).expectComplete().verify(); | 			StepVerifier.create(handler.handleMessage(message)).expectComplete().verify(); | ||||||
| 			assertThat(controllerAdvice.isExceptionHandled()).isTrue(); | 			assertThat(context.getBean(TestControllerAdvice.class).isExceptionHandled()).isTrue(); | ||||||
| 		}); | 		}); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue