【问题标题】:Mixing scala and java in Play Framework在 Play Framework 中混合 scala 和 java
【发布时间】:2012-07-08 16:18:15
【问题描述】:

我有一个如下所示的 Java 文件:

package AuthorizeNetFingerprint;


class Fingerprint {
    private static Log logger = LogFactory.getLog(Fingerprint.class);

    private long sequence;
    private long timeStamp;
    private String fingerprintHash;

    private Fingerprint() {
    }

    /**
     * Creates a fingerprint with raw data fields.
     * 
     * @param loginID
     * @param transactionKey
     * @param sequence : this number will be concatenated with a random value
     * @param amount
     * @return A Fingerprint object.
     */
    public static String createFingerprint(String loginID,
                    String transactionKey, long sequence, String amount) {
         return transactionKey;
    }
}

我正在尝试像这样的 scala 访问它:

val fingerprint = new AuthorizeNetFingerprint.Fingerprint
val x_fp_hash = fingerprint.createFingerprint(x_api_login_id,
                  transaction_key, x_fp_sequence, x_amount)

它给了我这个错误:

AuthorizeNetFingerprint包中的对象指纹无法在AuthorizeNetFingerprint包中访问

是否可以在 Play Framework 中混合使用 scala 和 java?

我做错了什么?

编辑

我需要: 公共类指纹

而不是

class Fingerprint

【问题讨论】:

    标签: java scala playframework


    【解决方案1】:

    三件事:

    1. 您已经知道,您的 Fingerprint 类需要公开。
    2. 您已将 Fingerprint 的构造函数设为私有;你不能实例化它。
    3. Java 类中的任何静态方法都应通过该类在 Scala 中的伴随对象进行访问。

    您示例中的所有 Scala 代码都应替换为:

    val x_fp_hash = AuthorizeNetFingerprint.Fingerprint.createFingerprint(…)
    

    这适用于使用 sbt (0.11.3) 编译的 Scala (2.9.1) 控制台。

    是的,您可以在 Play2 应用程序中混合使用 Java 和 Scala,只需将 Java 代码放在 app 目录中即可。请注意,Java 类需要位于其相应的包目录中,而 Scala 类则不然。

    【讨论】:

      【解决方案2】:

      我不熟悉 Play 框架,但是您的 Scala 示例代码中的第一行应该实例化类 AuthorizeNetFingerprint.Fingerprint,它只有一个私有构造函数,而不是一个公共类(即只能从同一个包中访问)。

      在完成课程public 之后,调用AuthorizeNetFingerprint.Fingerprint.createFingerprint(...) 是否可行?

      【讨论】:

      • 对 AuthorizeNetFingerprint.Fingerprint.createFingerprint(...) 的调用会引发相同的错误。我在 scala 脚本的顶部导入包。
      • 您还应该公开Fingerprint 类(除非您从同一个包中访问它)——这有帮助吗?
      【解决方案3】:

      理论上这应该可以正常工作。查看此博客 Re Java and Scala interop。 http://www.codecommit.com/blog/java/interop-between-java-and-scala

      在创建项目时,您是否指定了 Java、Scala 或 None(1,2 或 3)

      【讨论】:

      • 创建play项目后可以不指定吗?我在哪里可以将其设置为无?我应该将其设置为无吗?
      • 如果您检查项目目录中的 Build.scala 文件,您将看到语言很可能被指定为 JAva。现在我在这里猜测,但我假设在您的项目的编译阶段会期望在您的应用程序代码中只看到 Java。
      • 没有这样的设置。创建项目时会询问该问题,并且仅用于决定将哪个示例控制器(Java 或 Scala)放入您的应用程序中。您可以将 Scala 代码添加到“Java”Play2 应用程序,并将 Java 代码添加到“Scala”应用程序。
      【解决方案4】:

      Java 包的命名习惯是全部小写。

      如果您尝试使用以大写开头的 Java 包,Scala 似乎也会感到困惑。如果你使用authorize作为包名而不是AuthorizeNetFingerprint,它将编译。

      另外,没有必要这样做:

      val fingerprint = new AuthorizeNetFingerprint.Fingerprint 
      

      createFingerprint 是一个静态方法,所以只需调用

      val x_fp_hash = Fingerprint.createFingerprint
      

      (导入authorize.Fingerprint后)。

      【讨论】:

        猜你喜欢
        • 2015-04-15
        • 1970-01-01
        • 2014-12-26
        • 2013-06-18
        • 1970-01-01
        • 2013-09-18
        • 2012-05-05
        • 2011-05-25
        • 2016-02-23
        相关资源
        最近更新 更多