我们正在使用Kryo在Scala应用程序和Java应用程序之间进行通信。由于类定义必须从Java中使用(我们不希望将Scala库作为Java应用程序中的依赖项包含在内),因此我们使用JavaBeans来定义传输对象。
但是,在Scala中直接使用JavaBeans有点麻烦。没有模式匹配,不得不使用new等。我们现在正在做的是定义提取器并在Scala端的单独对象中应用方法,以便更好地使用这些类。
由于我们需要的大多数是样板文件,我们想知道是否有办法自动执行此操作。例如,我们有这个JavaBean(大约有20多种不同的消息类型):
public class HandshakeRequest extends Request {
private String gatewayId;
private String requestId;
private Date timestamp = new Date();
public HandshakeRequest(String gatewayId, String requestId) {
this.gatewayId = gatewayId;
this.requestId = requestId;
}
public String getGatewayId() { return gatewayId; }
public String getRequestId() { return requestId; }
public Date getTimestamp() { return timestamp; }
private HandshakeRequest() { /* For Kryo */ }
}
这是我们用来桥接Scala的对象示例:
object Handshake {
def unapply(msg: HandshakeRequest): Option[ (DateTime, String, String) ] = {
(
new DateTime(msg.getTimestamp.getTime),
msg.getRequestId,
msg.getGatewayId
).some
}
def apply(gatewayId: String, requestId: String) = new HandshakeRequest(gatewayId, requestId)
}
由于我们所有的对象都有Timestamp,因此它也是样板文件的一部分。我们喜欢某种方式(可能是一个宏?)来自动生成unapply和apply方法(理想情况下,整个对象本身)。
有谁知道一个简单的方法来实现这个目标?
答案 0 :(得分:4)
由于没有答案,我想出了这个:https://github.com/yetu/scala-beanutils。
答案 1 :(得分:1)
我已经启动了一个项目https://github.com/limansky/beanpuree,它允许从bean转换为case类。我将添加更多功能,例如Java数字类和Scala类之间的自动类型转换。