【问题标题】:How can I use the Scala REPL to test java code - java and scala REPL giving different outputs如何使用 Scala REPL 测试 java 代码 - java 和 scala REPL 提供不同的输出
【发布时间】:2011-12-01 13:40:17
【问题描述】:

我正在尝试使用 REPL 来测试我的 java 代码。我已经设置了我的类路径并启动了 REPL,我可以在 REPL 中访问我的应用程序类。

我启动了一个调用 web 服务的方法,它抛出了 java.lang.ClassCastException。我编写了一个 java 程序,它与在 REPL 中输入的一系列命令执行相同的操作,并使用相同的类路径运行它,它运行没有问题并给出结果。

关于为什么它不在 scala 下运行的任何线索? scala 中的强制转换规则是否严格?如果我使用的是我无法控制的 API,我怎么能告诉 Scala 表现得像 java,这样我就可以测试我的方法,这些方法会进行很多 API 调用和别人写的代码。

java.lang.ClassCastException: weblogic.webservice.encoding.ImageCodec cannot be cast to weblogic.xml.schema.binding.Serializer
        at weblogic.xml.schema.binding.internal.XSDTypeMapping.addOptionalEntries(XSDTypeMapping.java:762)
        at weblogic.xml.schema.binding.internal.XSDTypeMapping.createOptionalMapping(XSDTypeMapping.java:665)
        at weblogic.xml.schema.binding.internal.XSDTypeMapping.createPrimaryMapping(XSDTypeMapping.java:655)
        at weblogic.xml.schema.binding.internal.XSDTypeMapping.createInstance(XSDTypeMapping.java:138)
        at weblogic.xml.schema.binding.internal.XSDTypeMapping.<clinit>(XSDTypeMapping.java:118)
        at weblogic.xml.schema.binding.internal.TypeMappingFactoryBase.createDefaultMapping(TypeMappingFactoryBase.java:18)
        at weblogic.webservice.core.encoding.DefaultRegistry.<init>(DefaultRegistry.java:110)
        at weblogic.webservice.core.encoding.DefaultRegistry.<init>(DefaultRegistry.java:37)
        at weblogic.webservice.core.rpc.ServiceImpl.<init>(ServiceImpl.java:91)

由于很多人都要求源代码来回答这个问题,这里是我在 scala REPL 中输入的 sn-p。它进行受版权保护且无法在此处共享的 API 调用,我可以在不违反规范的情况下回答问题以提供有关此问题的更多信息。

val clientManager=new ClientManager()
val client=clientManager.getClient(<clientId>)
/*client location is stored in another system which exposes its data as a webservice.
 We use weblogic tools to compile the WSDL to create client (Web service client, not to
 be confused with the client object which represent a customer) to access the system
 hosting the data*/
val res=client.getLocation //exception is thrown at this line where a web-service call is made

我做了一些不同的事情,这次我得到了一个完全不同的例外 而不是使用val res=client.getLocation 我使用client.getLocation 而不将其分配给变量,这次抛出的异常是

java.lang.NoClassDefFoundError: Could not initialize class weblogic.xml.schema.binding.internal.XSDTypeMapping
        at weblogic.xml.schema.binding.internal.TypeMappingFactoryBase.createDefaultMapping(TypeMappingFactoryBase.java:18)
        at weblogic.webservice.core.encoding.DefaultRegistry.<init>(DefaultRegistry.java:110)
        at weblogic.webservice.core.encoding.DefaultRegistry.<init>(DefaultRegistry.java:37)
        at weblogic.webservice.core.rpc.ServiceImpl.<init>(ServiceImpl.java:91)

我使用 -nobootcp 选项运行解释,它运行时没有抛出任何上述异常,但在这两种情况下我得到的结果都是 null

任何人使用 Scala REPL 测试从 weblogic 10.3 生成的存根编写的客户端并成功使用它?

【问题讨论】:

  • 为什么这被否决了?我没有找到任何有效的 cmets 或拒绝投票的理由。我已经验证我正确设置了类路径和所有设置,我不确定为什么我只在 Scala REPL 中得到这个异常。我是 scala 的新手,只是尝试使用它。任何 cmets 或回复都会有所帮助,请提供一些提示,说明您认为此问题不正确或无效的原因
  • 包含一些代码....仅堆栈跟踪是不够的
  • 嗨,我无法包含剩余的代码,因为它们受版权保护,并且它们是我们客户特定的 API。我想堆栈跟踪中有足够的信息。我们正在尝试将 weblogic.webservice.encoding.ImageCodec 转换为不允许的 weblogic.xml.schema.binding.Serializer。但是,当从具有相同类路径的 java main 方法调用时,相同的 API 调用不会产生此类强制转换异常。包 weblogic.* 是 weblogic API 的一部分,我们已将它们包含在类路径中。
  • 进行强制转换的是 JVM。我最好的猜测是 Java 正在使用一些自定义类加载器。
  • 我没有在 java 中使用任何自定义类加载器。我刚刚编写了一个 main 方法,其中包含我在 Scala REPL 中输入并执行它的相同命令集。无论如何,我会检查类加载,看看是否有问题。

标签: java scala casting


【解决方案1】:

您的堆栈跟踪与 Scala 无关。异常发生在一些 weblogic 代码的深处。为什么你认为 Scala 导致了这个问题?最可能的原因是库中的不匹配,例如您在 Scala 测试中使用的类路径与 Java 测试中不同。

不过,我将尝试回答您的隐含问题:对于可以在 Java 和 Scala 中等价表达的引用类型,Scala 的强制转换规则与 Java 相同。

【讨论】:

  • 我对 scala 和 java 使用相同的类路径。我已经在 shell 中导出了 CLASSPATH 变量,并在同一个 shell 中同时使用了 scala 和 java。我会尝试检查我的类路径设置是否有任何问题。
  • 使用 -nobootcp 选项测试,它运行时没有错误,但结果为 null。如果使用 client.getLocation 而不将其分配给变量而不是 val res=client.getLocation 则会引发不同的异常。我已经用详细信息更新了问题。
【解决方案2】:

如果没有代码,真的很难判断发生了什么。但是......既然你提到你正在启动一个网络服务,我猜你正在使用 Scala 远程演员。

在你之前start演员尝试做classLoader = getClass().getClassLoader()

【讨论】:

  • 我在 Scala 中写的不多。我可以在这里给出代码,但它包含许多 API 调用,我不能在这里给出所有这些 API。
  • @tutysara - 抱歉,但我认为这还不够。如果您无法提供导致问题的代码,那么您可能只能靠自己了。恐怕是专有软件的危险之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2023-03-25
  • 2012-02-15
相关资源
最近更新 更多