小编bru*_*uto的帖子

Webclient 响应处理程序(成功和错误)不会为空响应主体执行

有一个用 OkHttp 实现的异步 REST API 客户端,工作得很好。出于好奇,试图将其转换为 WebClient,观察到奇怪的行为。

WebClient 配置就是这样:

webClient = WebClient.builder()
    .defaultHeaders(headers -> headers.add(HttpHeaders.CONTENT_TYPE,
        org.springframework.http.MediaType.APPLICATION_JSON_VALUE))
    .clientConnector(new ReactorClientHttpConnector(builder -> builder
        .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, timeout)))
    .build();
Run Code Online (Sandbox Code Playgroud)

请求代码:

void getTokenWithWebClient(Consumer<Try<String>> callback) {
    webClient.post()
        .uri(url)
        .syncBody(new MyRequest())
        .retrieve()
        .onStatus(status -> status.value() != HttpStatus.OK.value(),
            rs -> rs.bodyToMono(String.class).map(body -> new IOException(String.format(
                "Response HTTP code is different from 200: %s, body: '%s'", rs.statusCode(), body))))
        .bodyToMono(MyResponse.class)
        .subscribe(rs -> callback.accept(Try.of(() -> validateResponse(Option.of(rs)))),
            ex -> callback.accept(Try.failure(ex)));
}
Run Code Online (Sandbox Code Playgroud)

在单元测试中,作为参数传递给此方法的回调完成了我等待的 Future。因此,当我在 IDEA 中运行测试并且请求导致响应为空主体(内容长度:0)时,subscribe() 中的 lambdas 永远不会执行 - 使用 println 调试进行验证。

但是,当我 …

spring-webflux

6
推荐指数
1
解决办法
4618
查看次数

应用插件的不同方式?(Gradle Kotlin DSL)

试图将这个项目的构建迁移到 GSK。我们在 Groovy 中有这个:

allprojects {
    apply plugin: 'java'
...
    sourceSets {
        ...
    }
    sourceCompatibility = ...
}
Run Code Online (Sandbox Code Playgroud)

因此,在弄清楚如何在 Kotlin 中访问插件约定时,我发现:

allprojects {
    plugins {
        java apply true
    }
    ...
    println("Project $name, plugins: ${plugins}") // empty list
    val java = the<JavaPluginConvention>() // throws exception
}
Run Code Online (Sandbox Code Playgroud)

但如果你这样做:

allprojects {
    apply {
        plugin(JavaPlugin::class.java)
    }
}
Run Code Online (Sandbox Code Playgroud)

应用了插件并且约定变得可访问

什么?

gradle kotlin gradle-kotlin-dsl

5
推荐指数
1
解决办法
5230
查看次数

使用 Gradle Kotlin 配置 Maven 插件

尝试将项目转换为 GSK

我们在 Groovy 中有这个:

subprojects {
    plugins.withType(MavenPlugin) {
        tasks.withType(Upload) {
            repositories {
                mavenDeployer {
                    mavenLocal()
                    repository(url: "xxx") {
                        authentication(userName: "yyy", password: "zzz")
                    }
                    snapshotRepository(url: "xxx") {
                        authentication(userName: "yyy", password: "zzz")
                    }
                    pom.artifactId = "${project.name}"
                    pom.version = "$version"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在葛兰素史克,我得到了这样的结果:

plugins.withType(MavenPlugin::class.java) {
    tasks.withType(Upload::class.java) {
        val maven = the<MavenRepositoryHandlerConvention>()
        maven.mavenDeployer {
            // ???
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何实际构建/配置存储库对象以分配给 MavenDeployer 的存储库/snapshotRepository 属性?Groovy 摘录中的 mavenLocal() 对部署程序有什么作用,以及如何在 Kotlin 中调用它(因为它是 RepositoryHandler 上的方法,而不是 MavenDeployer 上的方法)?问题,问题

使用 Gradle 4.4

gradle kotlin gradle-kotlin-dsl

5
推荐指数
1
解决办法
2238
查看次数