Skip to content

RouterFunctions Builders do not support ServerResponse subtypes #35791

@krezovic

Description

@krezovic

org.springframework.web.reactive.function.server.RouterFunctions builder methods use HandlerFunction<ServerResponse> as their input types, rather than something like HandlerFunction<? extends ServerResponse> or equivalent generic signature similar to RouterFunctions::route(RequestPredicate,HandlerFunction).

This makes it infeasible to use other ServerResponse sub types such as EntityResponse or RenderingResponse.

Example code that does not compile

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.RenderingResponse;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;

@Component
public class TestRouter {
    @Bean
    RouterFunction<? extends ServerResponse> myRoutes() {
        return RouterFunctions.route()
                .GET("/example", request -> renderSomething())
                .GET("/example2", request -> renderSomething2())
                .build();
    }

    Mono<RenderingResponse> renderSomething() {
        return RenderingResponse.create("example").build();
    }

    Mono<ServerResponse> renderSomething2() {
        return RenderingResponse.create("example").build().map(ServerResponse.class::cast);
    }
}

Metadata

Metadata

Assignees

Labels

in: webIssues in web modules (web, webmvc, webflux, websocket)type: enhancementA general enhancement

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions