2017-06-29 107 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

相关问题