Spring,webflux:当从WebTestClient执行请求时,ServerHttpRequest对象的getRemoteAddress方法返回null
我有一个控制器Spring,webflux:当从WebTestClient执行请求时,ServerHttpRequest对象的getRemoteAddress方法返回null,spring,spring-test,spring-webflux,Spring,Spring Test,Spring Webflux,我有一个控制器 @RestController public class NameController { @Autowired private NameService nameService; @GetMapping("/name") public Mono<UploadParamsDto> getName(ServerHttpRequest request) { return nameService.getNameByH
@RestController
public class NameController {
@Autowired
private NameService nameService;
@GetMapping("/name")
public Mono<UploadParamsDto> getName(ServerHttpRequest request) {
return nameService.getNameByHost(request.getRemoteAddress().getHostName());
}
}
当我运行测试以检查我的getName方法时,我得到了NPE,因为
request.getRemoteAddress()返回null,您能告诉我如何模拟ServerHttpRequest吗?(我知道有MockServerHttpRequest,但我无法使用它)
我的目的是发出请求。getRemoteAddress().getHostName()返回模拟值。使用
@WebFluxTest
运行测试并不涉及真正的服务器,您已经了解了这一点
但是得到一个NullPointerException
仍然感觉不太对-你能就此提出一个问题吗?我认为您不必解决这个问题,但是Spring框架应该提供一些基础设施来“模拟”这些信息。谢谢大家。
工作方式如下:
@ExtendWith(SpringExtension.class)
@WebFluxTest(NameControllerTest.class)
@ActiveProfiles("test")
class NameControllerTest {
@Autowired
private ApplicationContext context;
@Test
void nameTest() {
WebTestClient webClient = WebTestClient
.bindToApplicationContext(context)
.webFilter(new SetRemoteAddressWebFilter("127.0.0.1"))
.configureClient()
.build();
webClient.get().uri("/name")
.accept(MediaType.APPLICATION_JSON)
.exchange()
.expectStatus()
.isOk();
}
}
其中SetRemoteAddressWebFilter是WebFilter:
public class SetRemoteAddressWebFilter implements WebFilter {
private String host;
public SetRemoteAddressWebFilter(String host) {
this.host = host;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
return chain.filter(decorate(exchange));
}
private ServerWebExchange decorate(ServerWebExchange exchange) {
final ServerHttpRequest decorated = new ServerHttpRequestDecorator(exchange.getRequest()) {
@Override
public InetSocketAddress getRemoteAddress() {
return new InetSocketAddress(host, 80);
}
};
return new ServerWebExchangeDecorator(exchange) {
@Override
public ServerHttpRequest getRequest() {
return decorated;
}
};
}
}
公共类SetRemoteAddressWebFilter实现WebFilter{
私有字符串主机;
公共SetRemoteAddressWebFilter(字符串主机){
this.host=host;
}
@凌驾
公共Mono筛选器(服务器WebExchange exchange、WebFilterChain链){
返回链。过滤器(装饰(交换));
}
专用服务器WebExchange(服务器WebExchange){
final ServerHttpRequest装饰=新的ServerHttpRequestDecorator(exchange.getRequest()){
@凌驾
公共InetSocketAddress getRemoteAddress(){
返回新的InetSocketAddress(主机,80);
}
};
返回新服务器WebExchangeCorator(exchange){
@凌驾
公共服务器HttpRequest getRequest(){
返回装饰;
}
};
}
}
这是一个很好的解释吗?
public class SetRemoteAddressWebFilter implements WebFilter {
private String host;
public SetRemoteAddressWebFilter(String host) {
this.host = host;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
return chain.filter(decorate(exchange));
}
private ServerWebExchange decorate(ServerWebExchange exchange) {
final ServerHttpRequest decorated = new ServerHttpRequestDecorator(exchange.getRequest()) {
@Override
public InetSocketAddress getRemoteAddress() {
return new InetSocketAddress(host, 80);
}
};
return new ServerWebExchangeDecorator(exchange) {
@Override
public ServerHttpRequest getRequest() {
return decorated;
}
};
}
}