找不到的 'org.springframework.web.reactive.function.client.WebClient' 型 Bean



我正在以本手册 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.
    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);
         }
      }

这是我的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>

还有我的控制器

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

您能否向我解释一下,当通过此行创建 Spring 应用程序时,如何创建 WebClient?

SpringApplication.run(MetricPushingApplication.class, args);

没有 WebClient 注册为 bean。

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

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

或者您可以按照 Spring 引导参考手册中的描述使用它

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

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

您应该在配置类中配置 Bean。例如:

@Configuration
    class Configuration{
    @Bean
    WebClient webClient(WebClient.Builder builder) {
        return builder.build();
    }
    }

然后,您可以在其他类中使用 WebClient 依赖项。例如:

class otherClass{
 private WebClient client;
 //Your use
}

您应该更新依赖项以解决找不到的"org.springframework.web.reactive.function.client.WebClient">问题

compile 'org.springframework.boot:spring-boot-starter-webflux:2.6.1'

请参阅已经发布的此答案。

相关内容

  • 没有找到相关文章

最新更新