I have a Spring app in which I have different rest controllers.
I want to have a different WebFluxConfigurations for the different controllers.
For example, for the ‘configureHttpMessageCodecs’ I want to have different codecs based on the controller, or based on the URI.
And I also want to have different implementations for the ‘nettyCustomizer’ bean, and different ‘openApiInteractionValidator’ beans, again based on the controller/URI.
I understand that there is a way to do that by using a DelegatingWebFluxConfiguration, but I find very little documentation online in order to understand how to implement what I need.
What I tried doing so far is to have 2 implementations of the WebFluxConfigurer as such:
@Configuration
public class WorkflowWebFluxConfiguration implements WebFluxConfigurer {
@Override
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
// Register custom json encoder/decoders for both application/json and application/hal+json, using our own object
// mapper.
configurer.customCodecs()
.registerWithDefaultConfig(new Jackson2JsonEncoder(workflowObjectMapper, MIME_TYPE_HAL, MimeTypeUtils.APPLICATION_JSON));
configurer.customCodecs()
.registerWithDefaultConfig(new Jackson2JsonDecoder(workflowObjectMapper, MIME_TYPE_HAL, MimeTypeUtils.APPLICATION_JSON));
}
and:
@Configuration
public class ActivityWebFluxConfiguration implements WebFluxConfigurer {
@Override
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
configurer.customCodecs().registerWithDefaultConfig(new Jackson2JsonEncoder(objectMapper, SUPPORTED_MIMETYPES));
configurer.customCodecs().registerWithDefaultConfig(new Jackson2JsonDecoder(objectMapper, SUPPORTED_MIMETYPES));
}
@Bean
public WebServerFactoryCustomizer<NettyReactiveWebServerFactory> nettyCustomizer() {
return factory -> factory
.addServerCustomizers(httpServer -> httpServer.httpRequestDecoder(spec -> spec.maxInitialLineLength(MAX_URI_LENGTH)));
}
@Bean
public OpenApiInteractionValidator openApiInteractionValidator(
@Value("classpath:apispecs/activity-v3.yaml") final Resource apiSpecification) throws IOException {
And I implemented this:
@Configuration
public class MainWebFluxConfiguration extends DelegatingWebFluxConfiguration {
@Autowired
public MainWebFluxConfiguration(WorkflowWebFluxConfiguration workflowWebFluxConfiguration,
ActivityWebFluxConfiguration activityWebFluxConfiguration) {
log.info("YYY main config web flux");
this.setConfigurers(List.of(workflowWebFluxConfiguration, activityWebFluxConfiguration));
}
}
But beyond that I dont understand how i route/point/configure each WebFluxConfiguration to handle specific URIs, or to map to a specific controller, or package, whichever way will work.
Any Help is so greatly appreciated.
Thanks!