无法找到“org.springframework.web.reactive.function.client.WebClient”类型的 Bean

her*_*upp 3 spring-boot spring-webclient

我正在使用本手册https://golb.hplar.ch/2018/01/Sending-Web-push-messages-from-Spring-Boot-to-Browsers.html的示例来研究推送通知。我面临的问题是,当我运行应用程序时,出现错误

    Parameter 1 of constructor in ru.stepanb.MetricPushingApplication.push.PushChuckJokeService required could not be found. 

    Consider defining a bean of type 'org.springframework.web.reactive.function.client.WebClient' in your configuration.
Run Code Online (Sandbox Code Playgroud)
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Service;
    import org.springframework.web.reactive.function.client.WebClient;

    @Service
    public class PushChuckJokeService {

      private final FcmClient fcmClient;

      private final WebClient webClient;

      private int seq = 0;
 
      public PushChuckJokeService(FcmClient fcmClient, WebClient webClient) {
         this.fcmClient = fcmClient;
         this.webClient = webClient;
      }

      @Scheduled(fixedDelay = 30_000)
      public void sendChuckQuotes() {
        IcndbJoke joke = 
        this.webClient.get().uri("http://api.icndb.com/jokes/random")
        .retrieve().bodyToMono(IcndbJoke.class).block();
         try {
          sendPushMessage(joke);
         } 
        catch (InterruptedException | ExecutionException e) {
          //Application.logger.error("send chuck joke", e);
       }
      }

      void sendPushMessage(IcndbJoke joke) throws InterruptedException, 
        ExecutionException {
          Map<String, String> data = new HashMap<>();
          data.put("id", String.valueOf(joke.getValue().getId()));
          data.put("joke", joke.getValue().getJoke());
          data.put("seq", String.valueOf(this.seq++));
          data.put("ts", String.valueOf(System.currentTimeMillis()));

          System.out.println("Sending chuck joke...");
          this.fcmClient.send(data);
         }

      }
Run Code Online (Sandbox Code Playgroud)

这是我的 pom.xml 文件

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
        
    <groupId>ru.stepanb</groupId>
    <artifactId>MetricPushingApplication</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>MetricPushingApplication</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath />
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.firebase</groupId>
            <artifactId>firebase-admin</artifactId>
            <version>6.8.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.codehaus.jackson</groupId>
                    <artifactId>jackson-core-asl</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.http-client</groupId>
                    <artifactId>google-http-client-jackson</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.http-client</groupId>
                    <artifactId>google-http-client-gson</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.api-client</groupId>
                    <artifactId>google-api-client-gson</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>joda-time</groupId>
                    <artifactId>joda-time</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.code.gson</groupId>
                    <artifactId>gson</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.auto.value</groupId>
                    <artifactId>auto-value</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.threeten</groupId>
                    <artifactId>threetenbp</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.json</groupId>
                    <artifactId>json</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.cloud</groupId>
                    <artifactId>google-cloud-firestore</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.apis</groupId>
                    <artifactId>google-api-services-storage</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.httpcomponents</groupId>
                    <artifactId>httpclient</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.httpcomponents</groupId>
                    <artifactId>httpcore</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.api</groupId>
                    <artifactId>gax</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.cloud</groupId>
                    <artifactId>google-cloud-storage</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.google.code.findbugs</groupId>
            <artifactId>jsr305</artifactId>
            <version>3.0.2</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <debug>true</debug>
                    <parameters>true</parameters>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-configuration-processor</artifactId>
                            <version>2.1.5.RELEASE</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>           
        </plugins>
    </build>



</project>
Run Code Online (Sandbox Code Playgroud)

还有我的控制器

        import org.springframework.http.HttpStatus;
        import org.springframework.web.bind.annotation.CrossOrigin;
        import org.springframework.web.bind.annotation.PostMapping;
        import org.springframework.web.bind.annotation.RequestBody;
        import org.springframework.web.bind.annotation.ResponseStatus;
        import org.springframework.web.bind.annotation.RestController;
    
        import reactor.core.publisher.Mono;
    
        @RestController
        @CrossOrigin
        public class RegistryController {
    
            private final FcmClient fcmClient;
    
            public RegistryController(FcmClient fcmClient) {
                this.fcmClient = fcmClient;
            }
    
            @PostMapping("/register")
            @ResponseStatus(HttpStatus.NO_CONTENT)
            public Mono<Void> register(@RequestBody Mono<String> token) {
                return token.doOnNext(t -> this.fcmClient.subscribe("chuck", t)).then();
            }
    
        }
Run Code Online (Sandbox Code Playgroud)

您还能向我解释一下当 Spring 应用程序是通过这一行创建时,WebClient 的创建是如何发生的吗?

SpringApplication.run(MetricPushingApplication.class, args);
Run Code Online (Sandbox Code Playgroud)

Sim*_*lli 15

没有 WebClient 注册为 bean。

您可以像这样简单地使用它:

WebClient.create().get().uri("http://api.icndb.com/jokes/random")
                  .retrieve().bodyToMono(IcndbJoke.class).block();
Run Code Online (Sandbox Code Playgroud)

或者您按照 Spring Boot 参考手册中的描述使用它

@Service
public class MyService {

    private final WebClient webClient;

    public MyService(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.baseUrl("https://example.org").build();
    }

    public Mono<Details> someRestCall(String name) {
        return this.webClient.get().uri("/{name}/details", name)
                        .retrieve().bodyToMono(Details.class);
    }

}
Run Code Online (Sandbox Code Playgroud)

请参阅:https ://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#io.rest-client.webclient