如何在可在Tomcat上运行的Spring Web应用程序中使用Spring的反应式WebClient

时间:2019-04-25 20:15:41

标签: spring-boot spring-webflux spring-web

无法在基于Tomcat的基于Spring引导的Web应用程序中使用Spring的反应式WebClient。应用程序启动本身由于未解决的依赖关系而失败。

我看着https://github.com/spring-projects/spring-boot/issues/9690,但不幸的是,这对我来说不是一个选择,因为我无法将WebApplication类型设置为None

我的gradle文件:

dependencies {

    compile(group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa') {
        exclude(module: 'tomcat-juli')
    }
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis'


    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web'
    compile group: 'org.springframework.session', name: 'spring-session'

    compile group: 'org.hibernate', name: 'hibernate-java8'
    compile group: 'org.hibernate', name: 'hibernate-validator', version: '5.2.4.Final'

    compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-guava'
    compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-hibernate5'
    compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310'

    compile group: 'com.google.guava', name: 'guava'
    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.3.2'
    compile group: 'org.postgresql', name: 'postgresql'

    compile group: 'io.jsonwebtoken', name: 'jjwt', version:'0.9.0'

    compile group: 'com.nimbusds', name: 'nimbus-jose-jwt', version:'5.12'

    // Spring managed dependency is not working, so resorted to using specific version
    // compile('org.springframework.boot:spring-boot-starter-webflux')
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '2.1.4.RELEASE'
    /*
    compile group: 'org.springframework', name: 'spring-web-reactive', version: '5.0.0.M1'
    compile group: 'org.springframework', name: 'spring-web', version: '5.1.6.RELEASE'
    */


    implementation 'com.auth0:jwks-rsa:0.7.0

}

bootRepackage {
    enabled = false
}

错误:

Caused by: java.lang.NoClassDefFoundError: org/springframework/http/client/reactive/ClientHttpConnector
        at org.springframework.web.reactive.function.client.WebClient.create(WebClient.java:144)

然后我尝试添加

compile group: 'org.springframework', name: 'spring-web-reactive', version: '5.0.0.M1'

然后抱怨什么,这让我补充了

compile group: 'org.springframework', name: 'spring-web', version: '5.1.6.RELEASE'

但是在启动我的应用程序时出现了另一个错误,这使我认为还有其他问题。

确切地说,我只想从另一个MicroService(基于Spring Boot的Web应用程序)中使用Reactive WebClient调用MicroService。

使用RestTemplate可以正常工作,但我只想尝试使用响应式WebClient并遇到错误。

由于我们托管依赖项的方式,托管依赖项无法正常工作。我们的依赖服务器无法解决它们。这就是拥有特定版本的Spring Boot依赖项的原因

1 个答案:

答案 0 :(得分:1)

org.springframework.http.client.reactive.ClientHttpConnectorspring-web jar的一部分,因此如果使用spring-boot-starter-webfluxspring-boot-starter-web可以使用。如果要编写基于servlet的传统应用程序,则应使用spring-boot-starter-web

检查gradle dependencies的输出,以确保您有一个spring-web jar。如果这样做,很有可能它已被损坏,应该清除gradle缓存。

我还建议您使用Spring Boot的managed dependencies而不是在每个依赖项上指定版本号。这将确保您获得已知可以很好地协同工作的版本。