如何使用Netty4ClientHttpRequestFactory为Spring AsyncRestTemplate设置代理?

当我使用SimpleRequestFactory和AsyncRestTemplate时,我可以轻松配置一个HTTP代理服务器。 我可以做(Kotlin示例代码): @Bean open fun asyncRestTemplate(): AsyncRestTemplate { val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress(“127.0.0.1”, 8008)) val requestFactory = SimpleClientHttpRequestFactory().apply { this.setConnectTimeout(TimeUnit.SECONDS.toMillis(10).toInt()) this.setReadTimeout(TimeUnit.SECONDS.toMillis(10).toInt()) this.setProxy(proxy) this.setTaskExecutor(taskExecutor()) } return AsyncRestTemplate(requestFactory) } 或者我可以简单地设置相应的系统属性: -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8008 。 然而,在我从SimpleClientHttpRequestFactory切换到Netty4ClientHttpRequestFactory的那一刻,没有直接配置代理的明显方式,看起来这个客户端也不尊重系统属性。 val requestFactory = Netty4ClientHttpRequestFactory().apply { this.setConnectTimeout(TimeUnit.SECONDS.toMillis(10).toInt()) this.setReadTimeout(TimeUnit.SECONDS.toMillis(10).toInt()) //this.setProxy(proxy) //??? } 一旦我换了netty客户端,我不知道如何通过代理。 我对使用netty客户端的兴趣是我不仅要做异步请求,而且我希望这是非阻塞的。 我希望在这里不要做错误的假设。 有谁知道如何使用Netty4ClientHttpRequestFactory时使用代理服务器,也许知道我可以使用Spring支持的另一个非阻塞客户端?

Spring Security多个成功的认证提供商

我希望我的Web应用程序的用户通过LDAP和其他自定义身份validation进行身份validation。 这是一个用Kotlin编写的Spring Boot应用程序。 我已经配置AuthenticationManagerBuilder如下 @Autowired lateinit var authenticationProvider: CustomAuthenticationProvider override fun configure(auth: AuthenticationManagerBuilder) { auth .authenticationProvider(authenticationProvider) auth .ldapAuthentication() .userDnPatterns(“uid={0},ou=people”) .groupSearchBase(“ou=groups”) .contextSource() .url(“ldap://localhost:8389/dc=example,dc=com”) .and() .passwordCompare() .passwordEncoder(PlaintextPasswordEncoder()) .passwordAttribute(“userPassword”) } 我想连锁身份validation,以便如果CustomAuthenticationProvider成功身份validation(function身份validation不会抛出)身份validation继续使用LDAP身份validation提供程序。 如果CustomAuthenticationProvider成功进行身份validation,则写入LDAP身份validation(以及任何后续的身份validation提供程序)不会被评估。 只有在CustomAuthenticationProvider引发时才执行LDAP认证。 我已经阅读了许多文章(例如Spring Security中的多个身份validation提供者),详细描述了具有多个身份validation提供程序但具有OR行为而非AND行为的文章。 有什么建议么?

空合并操作符的替代方法

使用Java,为了安全地访问像abcde这样的深层嵌套的引用,我们通常必须在每个级别指定空的检查,或者在Optional s中使用orElse() 。 (与像Kotlin / C#这样a?.b?.c?.d?.e语言不同的是, a?.b?.c?.d?.e或类似的语言。 我想知道下面的辅助方法是否是一个合理的选择: public T valueOrNull(Supplier expression) { try { return expression.get(); } catch (NullPointerException e) { return null; } } 这可以安全地使用value = valueOrNull(() -> abcde) 。 注意:我明白捕获NullPointerException通常是由于性能原因等原因而皱起眉头,但想知道这里的用法是否是一个合理的例外。

可以在Kotlin中编写函数(即在顶层)。 我可以unit testing那些顶级?

如果我在顶层编写代码(在课堂之外)。 我可以编写此代码的JUnit测试,而无需为此测试目的创建类?

Java构造函数reflection抛出与密封类的exception

我在Kotlin项目中有以下密封课程: sealed class Test { abstract val test: String @NoArg data class Test1( override val test: String ) : Test() @NoArg data class Test2( override val test: String ) : Test() } @NoArg注释是一个标记,编译器被配置为为这些类生成一个无参数构造函数。 我的问题是,尝试使用Javareflection结果实例化Test1和Test2中的以下exception: Exception in thread “main” java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at MainKt.main(Main.kt:27) Caused by: java.lang.IllegalAccessError: tried to […]

我可以更新深层嵌套的不可变对象,而不必知道它的上下文吗?

让我们想象我有一个嵌套的不可变对象图,沿着这些线(使用Kotlin语法,但希望很清楚): data class House(val bedroom: Bedroom, val bathroom: Bathroom, val kitchen: Kitchen) class Bedroom class Bathroom data class Kitchen(val oven: Oven, val kettle: Kettle) class Oven data class Kettle(val on: Boolean) var house = House(Bedroom(), Bathroom(), Kitchen(Oven(), Kettle(false))) 现在,我想打开水壶。 如果对象是可变的,我只会写: data class Kettle(var on: Boolean) { fun activate() { this.on = true } } house.kitchen.kettle.activate() […]

ojAlgo – 连续块逻辑的优化问题?

我正在使用ojAlgo来解决作为练习的课堂安排问题。 源代码可以在kotlin_solution文件夹的GitHub上find: https://github.com/thomasnield/optimized-scheduling-demo 一切都很顺利,直到我开始实施在Math Exchange上描述的连续块逻辑。 基本上,如果一个课程需要4个模块,那么这4个模块需要在一起。 出于某种原因,当我在这部分代码中实现连续逻辑时,这个建模逻辑会尖叫一声。 无限的搅动 这里是完整的Kotlin代码: import org.ojalgo.optimisation.ExpressionsBasedModel import org.ojalgo.optimisation.Variable import java.time.DayOfWeek import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalTime import java.util.concurrent.atomic.AtomicInteger // declare model val model = ExpressionsBasedModel() val funcId = AtomicInteger(0) val variableId = AtomicInteger(0) fun variable() = Variable(variableId.incrementAndGet().toString().let { “Variable$it” }).apply(model::addVariable) fun addExpression() = funcId.incrementAndGet().let { “Func$it”}.let { model.addExpression(it) } // […]

在哪里/如何为Kotlin软件包添加文档?

在Java中,如果你想记录一个包,它必须放在package-info.class文件中。 Kotlin和KDoc仍然是一样的吗? 我已经浏览了Kotlin的一些源代码,并且找不到它们的包文档在哪里编写。

具有不同源代码集的Gradle任务

我有两个任务, jar和run ,都依赖于build任务。 当被调用的时候,我希望它只在特定文件夹中构建文件。 然后当run被称为我想它建立相同的文件, jar做了加上另一个文件夹中的文件。 这是一个sudo代码示例: jar.build.sourcesets += ‘my/path/to/files’ run.build.sourcesets += jar.build.sourcesets run.build.sourcesets += ‘additonal/path/to/files’ 这是我现在在我的build.gradle文件不工作: sourceSets { main.kotlin.srcDirs += ‘src/main/kotlin’ run.kotlin.srcDirs += ‘src/test/kotlin’ run.resources.srcDirs += “src/main/resources” run.resources.srcDirs += “src/test/resources” run.output.resourcesDir = “build/js/resources” } 我一直在阅读关于源代码集,但我还没有find一个解决方案。 我应该怎么做呢?

运行unit testing没有发现变化

我正在通过kotlin koans回购( https://github.com/kotlin/kotlin-koans )。 每当我对.kt文件进行更改并运行unit testing时,.kt文件中的更改都不会反映在测试结果中。 我一直在运行unit testing之前运行./gradlew build 。 我正在使用Android Studio作为我的IDE。 有什么想法发生了什么?