2011-12-01 21 views
1

我正在嘗試使用REPL來測試我的java代碼。我設置了我的類路徑並啓動了REPL,並且可以在REPL中訪問我的應用程序類。我如何使用Scala REPL來測試java代碼 - java和scala 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中輸入的代碼片段。它使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選項,它運行時沒有拋出任何異常,但在上述情況下,我得到的結果爲空

任何人usi ng Scala REPL測試從weblogic 10.3生成的存根編寫的客戶端,併成功使用它?

+0

爲什麼這是被投票?我沒有找到任何有效的評論或理由對此進行投票。我已經驗證了我正確設置了類路徑和所有設置,我不確定爲什麼我只在Scala REPL中獲得此異常。我對scala很陌生,只是嘗試着使用它。任何意見或反應將有所幫助,請提供一些提示,爲什麼你認爲這個問題是不正確或無效 – tutysara

+0

包括一些代碼....單獨堆棧跟蹤是不夠的 – rana

+0

嗨拉納,我不能包括剩餘的代碼,因爲他們是版權和他們是我們客戶特定的API。我想堆棧跟蹤中有足夠的信息。我們正在嘗試將weblogic.webservice.encoding.ImageCodec強制轉換爲不允許的weblogic.xml.schema.binding.Serializer。但是,如果從具有相同類路徑的java main方法中調用相同的API調用,則不會產生此類轉換異常。包weblogic。*是weblogic API的一部分,我們已將它們包含在我們的類路徑中。 – tutysara

回答

0

沒有代碼,很難說出發生了什麼。但是...既然你提到你正在開始一個Web服務,我猜你正在使用Scala遠程參與者。

之前start演員試着做classLoader = getClass().getClassLoader()

+0

我在Scala中寫的不多。我可以在這裏給出代碼,但它包含很多API調用,我不能在這裏給所有的API。 – tutysara

+0

我根據您的要求更新了該問題的摘錄。 – tutysara

+1

@tutysara - 抱歉,但我不認爲這就足夠了。如果你不能提供導致問題的代碼,那麼你可能是你自己的。恐怕專有軟件的危害之一。 –

1

您的堆棧跟蹤與Scala無關。一些weblogic代碼中發生了異常。你爲什麼認爲斯卡拉造成這個問題?最可能的原因是庫中的不匹配,例如您在Scala測試中使用的是不同於Java測試中的類路徑。我試着回答你的隱含問題:對於可以在Java和Scala中同等表示的引用類型,Scala的鑄造規則與Java相同。

+0

我對scala和java都使用相同的類路徑。我已經在shell中導出了CLASSPATH變量,並使用了同一個shell中的scala和java。我將嘗試檢查我的類路徑設置是否存在任何問題。 – tutysara

+0

使用-nobootcp選項進行測試,它運行時沒有錯誤,但結果爲空。如果使用client.getLocation而不將其分配給變量而不是val res = client.getLocation,則會引發不同的異常。我已經用細節更新了這個問題。 – tutysara