2012-10-31 54 views
6

我从后面一些代码在2003年的工作还有就是下面的类的引用:遗留Java代码使用com.sun.net.ssl.internal.ssl.Provider()的

new com.sun.net.ssl.internal.ssl.Provider() 

这导致了一个错误:

Access restriction: The type Provider is not accessible due to restriction on required library /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/jre/lib/jsse.jar

有没有人有一个合适的替代使用这个类有什么建议?

+0

我不知道那个班,但我可以读'ssl'。如果这是安全套接字层,请考虑[javax.net.ssl。*](http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/package-summary.html) – ignis

+2

有很少有任何理由像这样手动实例化提供程序。什么是代码? – Bruno

回答

2

您可以在Eclipse首选项Java->Compiler->Errors/Warnings->Deprecated and restricted API中将其变为警告或非事件。请注意,正如其他人所说的那样,这不是最佳实践,当您有其他选择时应该避免。

+1

是的,你可以,但你通常不应该,至少不是全球性的。 – sleske

+0

为什么投下来?这是处理遗留代码的可行方式 –

+0

作为一般性建议,我觉得它很危险。作为临时解决方案,它可以。我喜欢你的编辑并删除了downvote。 – sleske

6

大多数情况下,您并不需要自己创建或获取提供者实例。正如Oracle Providers documentation说:

General purpose applications SHOULD NOT request cryptographic services from specific providers. That is:

getInstance("...", "SunJCE"); // not recommended 
    vs. 
getInstance("...");   // recommended 

此外,只要有一个为供应商过载的参数,它往往需要一个字符串或一个实例,但字符串(名称)可能会更普遍。 (有时候传递一个实例可能会很有用,例如对于某些PKCS#11配置,但这是不寻常的。)

JCA documentation about Providers应该是有用的。

如果您确实想要了解特定实例,则可以使用Security.getProvider(name)。您可以在提供商文档中找到适当的名称。

3

把这行代码扔掉。也请丢弃对com.sun.net.ssl包及其子包的任何引用:修复导入,以便它们引用javax.net.ssl.中的类

这是JDK 1.4之前的代码,从JSSE单独下载的日子开始。