1

我正在使用本手册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>

还有我的控制器

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

3 回答 3

4

没有 WebClient 注册为 bean。

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

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

或者您可以像 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);
    }

}

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

于 2019-06-13T14:58:06.080 回答
2

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

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

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

class otherClass{
 private WebClient client;
 //Your use
}
于 2021-07-14T04:32:42.207 回答
0

您应该更新依赖关系以解决无法找到的“org.springframework.web.reactive.function.client.WebClient”问题

请参阅已发布的此答案。

于 2021-12-06T10:25:07.833 回答