当前位置: 首页 > 知识库问答 >
问题:

如何在java中使用构造函数基初始化来初始化WebClient?

司徒斌
2023-03-14

我试图从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?

共有2个答案

司寇凯
2023-03-14

我解决了问题。这是对代码问题的依赖。添加后

   <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 );
    }
}

然后问题就解决了。

咸玄天
2023-03-14

实际上,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 如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添