我试图从WebClient中替换RestTemplate,因为根据Java文档,RestTemple将被弃用。Spring团队建议尽可能使用WebClient。
之前的RestTempalte代码如下
public Map<String,String> getInfo()
{
HttpHeaders headers = new HttpHeaders();
headers.set( ACCEPT, MediaType.APPLICATION_JSON_VALUE );
HttpEntity<?> entity = new HttpEntity<>( headers );
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl( this.endpoint + VERSION_INFO_PATH );
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<CPResponse> response = restTemplate.exchange(
builder.toUriString(),
HttpMethod.GET,
entity,
CPResponse.class );
List<Object> resultList = response.getBody().getResults();
if( response.getBody().getResults() != null && !( resultList )
.isEmpty() )
{
return ( ( LinkedHashMap ) resultList.get( 0 ) );
}
else
{
throw new CrawlerRuntimeExceptions( "Invalid response from API" );
}
}
我想从WebClient替换RestTemplate。所以我实现了类WebClientConnection,如下所示
public class WebClientConnection
{
private WebClient webClient;
public WebClientConnection( String baseUrl )
{
this.webClient = WebClient.create( baseUrl );
}
public Mono<CPResponse> get( String url )
{
return webClient.get().uri( "/{url}",url ).retrieve().bodyToMono( CPResponse.class );
}
public Flux<CPResponse> getAll( String url )
{
return webClient.get().uri( "/{url}",url ).retrieve().bodyToFlux( CPResponse.class );
}
public Mono<CPResponse> post( String url, HttpEntity entity )
{
return webClient.post().uri( "/{url}",url ).retrieve().bodyToMono( CPResponse.class );
}
}
我使用这个依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>>2.1.3.RELEASE</version>
</dependency>
public void getInfo()
{
WebClientConnection webClientConnection = new WebClientConnection( endpoint );
Mono<CPResponse> response = webClientConnection.get( VERSION_INFO_PATH );
}
Webclient create 上有堆栈溢出错误
public WebClientConnection( String baseUrl )
{
this.webClient = WebClient.create( baseUrl );
}
如何正确地从RestTemplate迁移到WebClient?
我解决了问题。这是对代码问题的依赖。添加后
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
并修改WebClientConnection类,如下所示。
public class WebClientConnection
{
private final WebClient webClient;
private static final String API_MIME_TYPE = "application/json";
private static final String API_BASE_URL = "http://localhost:8080";
private static final String USER_AGENT = "Spring 5 WebClient";
public WebClientConnection( )
{
this.webClient = WebClient.builder()
.baseUrl(API_BASE_URL)
.defaultHeader(HttpHeaders.CONTENT_TYPE, API_MIME_TYPE)
.defaultHeader(HttpHeaders.USER_AGENT, USER_AGENT)
.build();
}
public Mono<CPResponse> get( String url )
{
return webClient.get().uri( "/{url}",url ).retrieve().bodyToMono( CPResponse.class );
}
public Flux<CPResponse> getAll( String url )
{
return webClient.get().uri( "/{url}",url ).retrieve().bodyToFlux( CPResponse.class );
}
public Mono<CPResponse> post( String url, HttpEntity entity )
{
return webClient.post().uri( "/{url}",url ).retrieve().bodyToMono( CPResponse.class );
}
}
然后问题就解决了。
实际上,StackOverflow 异常 javadoc:
由于应用程序递归太深而发生堆栈溢出时抛出。
(这里有很好的解释)
就其本身而言,创建 WebClient 不包含此类递归。也许您正在某个地方(隐式)使用递归?
堆栈跟踪可以帮助找出问题所在。
问题内容: 在Java中,但是在其他OO语言中,初始化属性定义之间也有区别,例如 并使用构造函数对其进行初始化? 我想不出任何实际的区别,有没有?否则,即使结果相同,是否存在一种方法优于另一种方法的情况? 问题答案: 初始化顺序在这里很重要。 将字段设置为默认初始值(0,false,null) 调用对象的构造函数(但不要执行构造函数的主体) 调用超类的构造函数 使用初始化程序和初始化块初始化字段
我想在构造函数中初始化二维数组。但是,我在类中声明数组的实例变量时遇到了一个问题。如果我这样做就错了: 我怎么解决这个问题?
问题内容: 我有两个班,第一个是我的主班,第二个是我的编辑框架班。 我的第二个类(UpdateGUI)在其构造函数中提供oldName,并对其进行编辑,当我单击时,它将newName发送给我的第一个类。 我的第二堂课: 我的问题是,为什么newName为null? 更新: UpdateGUIDialog类: 输出: 我需要打印而不是null。 问题答案: Java对象有点像真实对象。并顾名思义:它
问题内容: 我不明白原始是如何转换为char数组的。如果我尝试使用其他代码,则会引发编译错误。 问题答案: 有两个属性: 因为您位于的构造函数中,所以您有权访问其私有字段和。 您无法从String类的外部访问这些字段,因此,如果尝试执行此操作,将抛出编译错误。
问题内容: 我在实例类型“ Person”中添加了一个实例变量,该类是引用类型(“ Date”,我为此编写了一个类)。因此,在我的Person类的构造函数中,我试图使用Date类的构造函数初始化Date属性,但是不确定如何执行此操作。以前,我只初始化过原始类型(或字符串),如下所示。这是我的代码中的一段。我不确定如何初始化“生日”,以便它使用Date类的构造函数。谢谢! 问题答案: 您是说要使用D
主要内容:初始化 const 成员变量构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用 初始化列表。 C++构造函数的初始化列表使得代码更加简洁,请看下面的例子: 运行结果: 小明的年龄是15,成绩是92.5 李华的年龄是16,成绩是96 如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添