小编Ale*_*lex的帖子

在Kotlin尝试资源

当我尝试在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)

extension-methods try-with-resources kotlin

133
推荐指数
3
解决办法
2万
查看次数

检测并恢复发生故障的H2集群节点

在浏览了H2开发人员指南之后,我仍然不明白如何在发生临时网络故障时找出哪些集群节点发生故障以及哪些数据库需要恢复.

让我们考虑以下场景:

  • H2集群以N个活动节点开始(实际上H2确实支持N> 2,即超过2个集群节点?)
  • (很多数据库更新,读取......)
  • 与一个(或多个)群集节点的网络连接关闭,节点对群集的其余部分不可见
  • (很多数据库更新,读取......)
  • 恢复先前断开连接的节点的网络链接
  • 发现群集节点可能丢失(据我所知,SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER'如果群集中的一个节点发生故障,则开始响应空字符串)

在此之后,目前还不清楚如何找出哪些节点出现故障?显然,我可以做一些基本的检查,如比较DB大小,但它是不可靠的.

  1. 什么是建议的过程来找出群集中缺少的节点,尤其是 如果上面的查询响应空字符串?

  2. 另一个问题 - 为什么urlTarget不支持多个参数?如果群集中的多个节点出现故障并且我想恢复多个节点,我应该如何使用CreateCluster工具?

  3. 另外我不明白如果我不得不停止群集并且我不想实际恢复任何节点,CreateCluster如何工作?我不清楚的是,如果我实际上不需要复制数据库,我需要传递给CreateCluster工具.

high-availability h2

9
推荐指数
1
解决办法
473
查看次数

AOP与Kotlin

我在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生成的代理,因为它们施加了太多的限制,例如告别最终类而没有无参数的公共构造函数.

aop kotlin

7
推荐指数
1
解决办法
3548
查看次数

在maven中使用grpc

有谁知道如何在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创建了一个完整的客户端 - 服务器应用程序示例.

java maven grpc

7
推荐指数
1
解决办法
7538
查看次数

Spring Security - REST API和其他URL的单独配置

我有两组URL - 一组是REST API,第二组是 - 非常普通的网站.我想为REST API应用不同的安全规则,以便偶尔调用REST API的用户/脚本将使用401代码(基本身份验证可以正常)或仅403来应答.

所以我想允许访问REST API:

  • 已登录的用户(对于调用REST API的站点页面上的javascript,因此共享同一会话).
  • 一些在WWW-Authenticate标头中使用基本身份验证凭据调用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)

spring spring-mvc spring-security

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

如何在初始化 Kotlin 对象时存储临时变量?

我正在学习 Kotlin,作为学习它的一部分,我想设计一个表示有理数的类,要求:

  • 类应该包含两个不可变的整数字段:分子和分母。
  • 类应包含有效的 equals、hashCode 和 toString 实现。
  • 当类被初始化时,分子和分母应该被它们的 GCD 删除(这意味着Ratio(1, 2) == Ratio(2, 4 /* or 4, 8 */) or Ratio(2, 4 /* or 4, 8 */).numerator == 1, .denominator == 2等)
  • 此类应包含 mul 方法,该方法采用另一个 Ratio 并返回当前比率与给定比率的乘法结果。

我尝试使用看起来适合该任务的数据类,但我无法定义自定义构造函数(分子和分母都需要删除到它们的 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)

kotlin

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

运行maven编译两次

我正在将ant项目迁移到maven,这个项目很不寻常:它在这些编译步骤之间使用了两个编译步骤和代码生成步骤.整个构建过程可以描述如下:

  1. 编译src目录中的所有内容
  2. 运行内部java工具,将java指向已编译的类和用于编译这些类的jar.此工具使用反射基于编译的类生成代码.
  3. 编译生成的类,最后组装一个jar.

我发现了一些建议创建自定义生命周期的链接,但我不知道从哪里开始.如果有人可以指出类似的项目配置真的很棒.

用maven实现这个目标的最简单方法是什么?我想我应该使用ant maven插件,但我仍然不明白如何使它编译源两次并在第一次编译步骤后将其指向生成的源.

java ant maven

4
推荐指数
1
解决办法
3074
查看次数

将分支上的 git 提交保存到文件中

给定本地分支(比如“测试”) - 是否可以使用一些 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”。

我知道这可以通过将更改推送到远程分支来实现,但出于某些原因,我想避免这样做,是的,我知道分支很便宜,但相信我,我有充分的理由不将这些更改推送到远程分支。

git

3
推荐指数
1
解决办法
3376
查看次数

为什么typeof(method)不返回reflect.Method实例?

假设我有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操作的接收者信息。

我有两个问题:

  1. 我是正确的,没有办法在TypeOf上面的调用中获取代码片段中的接收者类型吗?
  2. 如果我想将有关方法的反射信息传递给打算分析功能和相关接收者的代码(实质上是方法),我有什么选择?

尝试自己回答第二个问题,并根据我在官方文档中看到的内容,看来我唯一的选择是传递TypeOf(receiver)和TypeOf(receiver.method)或TypeOf(receiver)以及接收方的方法名称。

reflection methods types go

2
推荐指数
1
解决办法
50
查看次数