我正在尝试使用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生成的存根中编写的客户端并成功使用它?
答案 0 :(得分:1)
您的堆栈跟踪与Scala无关。一些weblogic代码中发生了异常。为什么你认为Scala导致了这个问题?最可能的原因是库中的不匹配,例如您在Scala测试中使用的是与Java测试中不同的类路径。
但是,我会尝试回答你的隐含问题:对于可以在Java和Scala中等效表示的引用类型,Scala的转换规则与Java相同。
答案 1 :(得分:0)
如果没有代码,很难说出发生了什么。但是......既然你提到你正在启动一个Web服务,我猜你正在使用Scala远程actor。
在你start
演员尝试classLoader = getClass().getClassLoader()
之前。