如何使用Scala REPL来测试java代码 - java和scala REPL提供不同的输出

时间:2011-12-01 13:40:18

标签: java scala casting

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

我启动了一个进行webservice调用的方法,它抛出了一个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中输入的代码片段。它使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生成的存根中编写的客户端并成功使用它?

2 个答案:

答案 0 :(得分:1)

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

但是,我会尝试回答你的隐含问题:对于可以在Java和Scala中等效表示的引用类型,Scala的转换规则与Java相同。

答案 1 :(得分:0)

如果没有代码,很难说出发生了什么。但是......既然你提到你正在启动一个Web服务,我猜你正在使用Scala远程actor。

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