2017-06-29 105 views
-1

我使用下面的代碼模式匹配的PrivateKey一個實例:模式匹配失敗的第二次嘗試

import java.security.interfaces.{RSAPrivateKey, RSAPublicKey} 
import java.security.{PrivateKey, PublicKey} 

object ClientPrivateKey { 
    def apply(privateKey: PrivateKey) = privateKey match { 
    case k: RSAPrivateKey ⇒ RSAClientPrivateKey(k) 
    case k: EdDSAPrivateKey ⇒ EDCClientPrivateKey(k) 
    } 
} 

val pk: PrivateKey = .... 
ClientPrivateKey(pk) 

sbt ~test運行測試時我得到一個怪異的行爲。

[info] scala.MatchError: [email protected] (of class net.i2p.crypto.eddsa.EdDSAPrivateKey) 
[info] at com.advancedtelematic.libtuf.data.ClientDataType$ClientPrivateKey$.apply(ClientDataType.scala:39) 
[info] at com.advancedtelematic.tuf.keyserver.daemon.KeyGenerationOp$$anonfun$saveToVault$1.apply(KeyGeneratorLeader.scala:122) 
[info] at com.advancedtelematic.tuf.keyserver.daemon.KeyGenerationOp$$anonfun$saveToVault$1.apply(KeyGeneratorLeader.scala:121) 
[info] at scala.concurrent.Future$$anonfun$traverse$1.apply(Future.scala:576) 
[info] at scala.concurrent.Future$$anonfun$traverse$1.apply(Future.scala:575) 
[info] at scala.collection.TraversableOnce$$anonfun$foldLeft$1.apply(TraversableOnce.scala:157) 
[info] at scala.collection.TraversableOnce$$anonfun$foldLeft$1.apply(TraversableOnce.scala:157) 

哪個是奇怪,因爲net.i2p.crypto.eddsa.EdDSAPrivateKey匹配被匹配的對象的類型:在測試通過,在隨後的嘗試,而無需重新啓動SBT第一次運行,與所述測試失敗。

什麼可以干擾這種模式匹配?

回答

1

我想到的一件事是,您的privateKey可能來自與模式匹配代碼默認使用的不同類加載器。

你可以測試這個例如像這樣:

def apply(privateKey: PrivateKey) = privateKey match { 
    case k: RSAPrivateKey ⇒ RSAClientPrivateKey(k) 
    case k: EdDSAPrivateKey ⇒ EDCClientPrivateKey(k) 
    case k if k.getClass.getName == classOf[EdDSAPrivateKey].getName => 
    val sameClasses = k.getClass == classOf[EdDSAPrivateKey] 
    val sameClasses = k.getClass.getClassLoader == classOf[EdDSAPrivateKey].getClassLoader 
    throw new Exception(s"Different class loaders? $sameClasses $sameClassLoaders") 
} 
+0

似乎是這種情況。 'java.lang.Exception:不同的類加載器?假假'我該如何解決這個問題? – simao

+0

不能給你一個簡單的答案。我想你的應用程序正在像一個Web服務器或OSGi的內部管理多個類加載器的容器中運行。 – ghik

+0

不是真的,只是一個演員的阿卡應用程序,這似乎發生在這個類,所以它很奇怪。 – simao

相關問題