将 ServerHttpRequest 转换为 HttpServletRequest

问题描述 投票:0回答:1

我正在将应用程序从 Netflix/Zuul 迁移到 Spring Cloud Gateway:

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest)exchange.getRequest();
    ServletServerHttpResponse serverHttpResponse = (ServletServerHttpResponse)exchange.getResponse();
    if (shouldFilter(exchange)) {
        try {
            log.debug("Invoking authorization interceptor");
            if (!checkRequest(
                    serverHttpRequest.getServletRequest(),
                    serverHttpResponse.getServletResponse(),
                    null)) {
                return Mono.error(new RuntimeException("Invalid request"));
            }
            return chain.filter(exchange);
        } catch (Exception exception) {
            log.error(ERROR_MESSAGE, exception);
            return Mono.error(exception);
        }
    }
    return Mono.empty();
}

我写的测试用例如下:

private GatewayFilterChain filterChain
private static ServerWebExchange exchange;

def setup() {
    exchange = mock(ServerWebExchange.class)
    ServerHttpRequest request = mock(ServerHttpRequest.class)
    ServerHttpResponse response = mock(ServerHttpResponse.class)
    filterChain = mock(GatewayFilterChain.class)
    when(filterChain.filter(exchange)).thenReturn(Mono.empty())
    when(exchange.getRequest()).thenReturn(request)
    when(exchange.getResponse()).thenReturn(response)
}

但是,在测试时,我收到以下错误:

java.lang.ClassCastException: class org.springframework.http.server.reactive.ServerHttpRequest$MockitoMock$6YiKyP1Z cannot be cast to class org.springframework.http.server.ServletServerHttpRequest (org.springframework.http.server.reactive.ServerHttpRequest$MockitoMock$6YiKyP1Z and org.springframework.http.server.ServletServerHttpRequest are in unnamed module of loader 'app')

我确实必须坚持使用

HttpServletRequest
HttpServletResponse
中的
jakarta
,否则重新实现下游服务将是一场噩梦。将 ServerHttpRequest 转换/转换为 HttpServletRequest 的最佳方法是什么?

java spring spring-boot spring-cloud spring-cloud-gateway
1个回答
0
投票

是因为测试用例错误

应该是这样的

私有GatewayFilterChain过滤器链 私有静态 ServerWebExchange 交换;

 def setup() {
    exchange = mock(ServerWebExchange.class);
    ServletServerHttpRequest servletRequest = mock(ServletServerHttpRequest .class);

    ServletServerHttpResponse servletResponse = mock(ServletServerHttpResponse .class);
    ServerHttpRequest request = mock(ServerHttpRequest.class)
    ServerHttpResponse response = mock(ServerHttpResponse.class)
    filterChain = mock(GatewayFilterChain.class)
    when(filterChain.filter(exchange)).thenReturn(Mono.empty())
    when(exchange.getRequest()).thenReturn(servletRequest )
    when(exchange.getResponse()).thenReturn(servletResponse )
    when(servletRequest .getRequest()).thenReturn(request)
    when(servletResponse .getResponse()).thenReturn(response)

}
© www.soinside.com 2019 - 2024. All rights reserved.