有一个用 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 调试进行验证。
但是,当我 …
试图将这个项目的构建迁移到 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)
应用了插件并且约定变得可访问
什么?
尝试将项目转换为 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