【问题标题】:Automatically wrapping/converting JavaBeans into case classes自动将 JavaBean 包装/转换为案例类
【发布时间】:2015-04-16 15:11:42
【问题描述】:

我们正在使用 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)
}

由于我们所有的对象都有时间戳,它也是样板的一部分。我们想要某种方式(可能是宏?)来自动生成 unapply 和 apply 方法(理想情况下,整个对象本身)。

有谁知道实现此目的的简单方法?

【问题讨论】:

    标签: scala


    【解决方案1】:

    由于没有答案,我想出了这个:https://github.com/yetu/scala-beanutils

    【讨论】:

      【解决方案2】:

      我已经启动了一个项目https://github.com/limansky/beanpuree,它允许将bean 转换为案例类。我将添加更多功能,例如 Java 数字类和 Scala 类之间的自动类型转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-26
        • 1970-01-01
        • 2016-07-27
        • 2014-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-08
        相关资源
        最近更新 更多