当我尝试在Kotlin中编写相当于try-with-resources的代码时,它对我不起作用.
我尝试了以下不同的变体:
try (writer = OutputStreamWriter(r.getOutputStream())) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
但都不起作用.
有谁知道应该使用什么?显然Kotlin语法没有这种结构的定义,但可能是我遗漏了一些东西.它定义了try块的语法,如下所示:
try : "try" block catchBlock* finallyBlock?;
Run Code Online (Sandbox Code Playgroud) 在浏览了H2开发人员指南之后,我仍然不明白如何在发生临时网络故障时找出哪些集群节点发生故障以及哪些数据库需要恢复.
让我们考虑以下场景:
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER'如果群集中的一个节点发生故障,则开始响应空字符串)在此之后,目前还不清楚如何找出哪些节点出现故障?显然,我可以做一些基本的检查,如比较DB大小,但它是不可靠的.
什么是建议的过程来找出群集中缺少的节点,尤其是 如果上面的查询响应空字符串?
另一个问题 - 为什么urlTarget不支持多个参数?如果群集中的多个节点出现故障并且我想恢复多个节点,我应该如何使用CreateCluster工具?
另外我不明白如果我不得不停止群集并且我不想实际恢复任何节点,CreateCluster如何工作?我不清楚的是,如果我实际上不需要复制数据库,我需要传递给CreateCluster工具.
我在Java上使用AOP很多.看起来传统的Java方法可以很容易地与Kotlin一起使用.考虑到Kotlin强调不变性,JDK代理似乎是Kotlin中最可行的解决方案,前提是你遵循相同的接口 - 首先(更好地说Kotlin中的trait-first)编程风格,例如:
trait MyService {
fun add(a: Int, b: Int): Int
}
class MyServiceImpl: MyService {...}
Run Code Online (Sandbox Code Playgroud)
所以现在可以轻松地在Spring/AOP中编写一个方面,并将其应用于MyServiceImpl的实例.应该提到的是,基于Java接口的生成代理可能更受Kotlin开发人员的青睐,因为cglib需要摆脱最终(即在Kotlin中使用开放类)并对每个应该由AOP代理包装的类使用无参数公共构造函数.
同时,基于Java接口的生成代理不幸会造成严重的性能损失,因此我想知道在某些情况下是否可以更直观地或本地地对Kotlin进行AOP编程.
因此,请考虑以下示例,当我想使用AOP时:
使用MyService/MyServiceImpl的上述示例中最有效但不幸的是最详细的暴力解决方案可能如下所示:
class MyServiceLoggingWrapper(val delegate: MyService): MyService {
val logger = LoggerFactory.getLogger(this.javaClass)
override fun add(a: Int, b: Int): Int {
val result = delegate.add(a, b);
logger.info("MyService.add({}, {}) = {}", a, b, result);
return result;
}
}
class MyServiceTxWrapper(val delegate: MyService, val txManager: TransactionManager): MyService {
// similar lengthy implementation
}
Run Code Online (Sandbox Code Playgroud)
该方法的LoC复杂度为O(N*K),其中N是方法的数量,K是我想要应用的多个方面.
所以我正在寻找的是Kotlin方面可能有效(在性能和LoC方面)的解决方案,而不是诉诸于cglib生成的代理,因为它们施加了太多的限制,例如告别最终类而没有无参数的公共构造函数.
有谁知道如何在maven中为grpc应用程序编译*.proto文件?
这就是我在maven中编译protobuf的方式 - (旧方法,使用已安装的protoc编译器,摘自pom.xml):
<build>
<plugins>
<!-- protocol buffers runner, requires protoc -->
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>generate-protobuf-sources</id>
<phase>generate-sources</phase>
<configuration>
<tasks>
<mkdir dir="target/generated-sources/java" />
<exec executable="protoc">
<arg value="--java_out=target/generated-sources/java" />
<arg value="src/main/protobuf/hello.proto" />
</exec>
</tasks>
<sourceRoot>target/generated-sources/java</sourceRoot>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
我想知道grpc是否有类似的东西.根据我的理解,我需要以某种方式将protoc-gen-grpc-java插件与protobuf连接,但我不知道该怎么做.
更新:对于那些感兴趣的人,我在github上使用maven创建了一个完整的客户端 - 服务器应用程序示例.
我有两组URL - 一组是REST API,第二组是 - 非常普通的网站.我想为REST API应用不同的安全规则,以便偶尔调用REST API的用户/脚本将使用401代码(基本身份验证可以正常)或仅403来应答.
所以我想允许访问REST API:
目前我正在试图弄清楚什么配置会让春天"理解"我想要的东西.我想出了以下配置:
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<http pattern="/" security="none" />
<http pattern="/static/**" security="none" />
<!-- REST API -->
<http pattern="/rest/*" use-expressions="true">
<http-basic />
<intercept-url pattern="/*" access="isAuthenticated()" />
</http>
<!-- Site -->
<http access-denied-page="/WEB-INF/views/errors/403.jsp" use-expressions="true">
<intercept-url pattern="/index.html" access="hasRole('ROLE_USER') or hasRole('ROLE_ANONYMOUS')" />
<intercept-url pattern="/login.html" access="hasRole('ROLE_USER') or hasRole('ROLE_ANONYMOUS')" />
<intercept-url pattern="/admin/*" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
<form-login login-page="/login.html"
default-target-url="/index.html"
authentication-failure-url="/login.html?error=1" />
<logout logout-url="/logout.do" logout-success-url="/index.html" …Run Code Online (Sandbox Code Playgroud) 我正在学习 Kotlin,作为学习它的一部分,我想设计一个表示有理数的类,要求:
Ratio(1, 2) == Ratio(2, 4 /* or 4, 8 */) or Ratio(2, 4 /* or 4, 8 */).numerator == 1, .denominator == 2等)我尝试使用看起来适合该任务的数据类,但我无法定义自定义构造函数(分子和分母都需要删除到它们的 GCD 中)。
可能的解决方案:
class Ratio(num : Int, denom : Int) {
val numerator = num / gcd(num, denom)
val denominator = denom / gcd(num, denom) // GCD calculated twice!
}
Run Code Online (Sandbox Code Playgroud)
定义类构造函数以便计算一次 GCD 的最简单方法是什么?
更新
好的,看起来我找到了可能的解决方案:
data class Ratio(num : …Run Code Online (Sandbox Code Playgroud) 我正在将ant项目迁移到maven,这个项目很不寻常:它在这些编译步骤之间使用了两个编译步骤和代码生成步骤.整个构建过程可以描述如下:
我发现了一些建议创建自定义生命周期的链接,但我不知道从哪里开始.如果有人可以指出类似的项目配置真的很棒.
用maven实现这个目标的最简单方法是什么?我想我应该使用ant maven插件,但我仍然不明白如何使它编译源两次并在第一次编译步骤后将其指向生成的源.
给定本地分支(比如“测试”) - 是否可以使用一些 git 魔法将该分支上的提交保存到一个文件中,我可以将该文件发送给其他开发人员,然后他们可以将这些提交应用到他的分支?我知道有一种方法可以将分支上的每个提交保存到文件中,但不确定是否可以仅对本地分支上的提交执行此操作。
例如,主分支已提交“a”、“b”和“c”,而我的测试分支已在“c”上创建,并提交了“d”和“e”:
+ (branch:master)
|
* commit:'a'
|
* commit:'b'
|
* commit:'c'
| \
... + (branch:test)
|
* commit:'d'
|
* commit:'e'
x
Run Code Online (Sandbox Code Playgroud)
因此,在生成“test”和“master”分支之间的差异后,我希望在该差异中只提交“d”和“e”。因此,其他开发人员也可以从 master 创建自己的测试分支,应用我的 diff 并在他的分支上提交“d”和“e”。
我知道这可以通过将更改推送到远程分支来实现,但出于某些原因,我想避免这样做,是的,我知道分支很便宜,但相信我,我有充分的理由不将这些更改推送到远程分支。
假设我有Foo结构,其方法定义如下:
type Foo struct {
Name string
}
func (f *Foo) Get(a int, b string) (string, error) {
return f.Name, nil
}
Run Code Online (Sandbox Code Playgroud)
如果我写
obj := &Foo{}
t := reflect.TypeOf(obj.Get)
Run Code Online (Sandbox Code Playgroud)
t.Kind()返回reflect.Func,显然我无法访问Get我从“属于” Foo结构中提取类型信息的函子,即接收方是Foo类型,甚至没有出现在参数中。
我想这是故意的,我想念一些有关函数的基本知识,这些函数使语言作者丢弃了应用于方法引用的typeof操作的接收者信息。
我有两个问题:
TypeOf上面的调用中获取代码片段中的接收者类型吗?尝试自己回答第二个问题,并根据我在官方文档中看到的内容,看来我唯一的选择是传递TypeOf(receiver)和TypeOf(receiver.method)或TypeOf(receiver)以及接收方的方法名称。