com.sun.faces.renderkit.html_basic.textrender存在哪些Java API替换(如果有)

com.sun.faces.renderkit.html_basic.textrender存在哪些Java API替换(如果有),java,jsf,sonarqube,Java,Jsf,Sonarqube,在Tomcat&JSF&Spring上运行的Java web项目上,编写了一个自定义呈现程序,以便在要转换的值为null的情况下调用自定义转换器,如下所述: 但是,SonarQube扫描在导入线上检测到一个问题,即: import com.sun.faces.renderkit.html_basic.TextRenderer; 因为它是com.sun.*包,而不是标准的JavaAPI包。规则说明说明如下: 来自sun的类。*不应使用squid:S1191包 sun.*或com.sun.*包中的

在Tomcat&JSF&Spring上运行的Java web项目上,编写了一个自定义呈现程序,以便在要转换的值为null的情况下调用自定义转换器,如下所述:

但是,SonarQube扫描在导入线上检测到一个问题,即:

import com.sun.faces.renderkit.html_basic.TextRenderer;
因为它是com.sun.*包,而不是标准的JavaAPI包。规则说明说明如下:

来自sun的类。*不应使用squid:S1191包 sun.*或com.sun.*包中的类被视为实现细节,不属于Java API的一部分

它们在迁移到Java的新版本时可能会导致问题,因为没有向后兼容性保证。类似地,当迁移到不同的Java供应商(如OpenJDK)时,它们可能会导致问题

这些类几乎总是由应该使用的JavaAPI类包装

不遵从代码示例
这很有意义,但我找不到这个类的Java API包装器,只有类所在的源代码和包。。。在这种情况下应该采取什么适当的措施?

我认为这是一种假阳性。使用com.sun.faces是使用内部实现特定的类,但用于JSF而不是JDK。这些类不会被其他JVM或某些新版本的JDK删除。您只需将代码绑定到Sun的Oracle JSF实现,这对您来说可能是好的,也可能不是好的


在查看该规则的代码时,看起来它是可配置的,以避免此类误报,但将exclude属性设置为逗号分隔的列表。我不确定您在UI中的具体位置可以做到这一点,但这可能是一个起点。

我认为这是一种误报。使用com.sun.faces是使用内部实现特定的类,但用于JSF而不是JDK。这些类不会被其他JVM或某些新版本的JDK删除。您只需将代码绑定到Sun的Oracle JSF实现,这对您来说可能是好的,也可能不是好的


在查看该规则的代码时,看起来它是可配置的,以避免此类误报,但将exclude属性设置为逗号分隔的列表。我不确定您在UI中的具体位置可以做到这一点,但这可能是一个起点。

@BalusC,我不确定我是否同意您的观点。警告的标题和描述实际上不匹配。标题说,使用com.sun.*绑定到一些实现细节,但不绑定到Oracle的JDK细节,您应该尝试使用一些java.*或javax.*类,这是正确的。描述目前主要集中在与JDK相关的sun.*上。但这个类最初是用来捕获com.sun.*的,后来又添加了sun.*。所以我不认为这是一个错误bug@BalusC,我觉得这个职位不是很有建设性。显然,SonarQube不能为整个Java世界中的每一个实现细节类提供预先制定的规则。他们从当时人们认为最重要的东西开始,即com.sun.*然后扩展到另一个非常重要的东西,即sun.*。但是SonarQube是可定制的开源软件,因此您可以添加与项目相关的自定义规则,甚至可以尝试将它们推送到主存储库中。@BalusC,我不确定是否同意您的意见。警告的标题和描述实际上不匹配。标题说,使用com.sun.*绑定到一些实现细节,但不绑定到Oracle的JDK细节,您应该尝试使用一些java.*或javax.*类,这是正确的。描述目前主要集中在与JDK相关的sun.*上。但这个类最初是用来捕获com.sun.*的,后来又添加了sun.*。所以我不认为这是一个错误bug@BalusC,我觉得这个职位不是很有建设性。显然,SonarQube不能为整个Java世界中的每一个实现细节类提供预先制定的规则。他们从当时人们认为最重要的东西开始,即com.sun.*然后扩展到另一个非常重要的东西,即sun.*。但是SonarQube是可定制的、开源的,因此您可以添加与项目相关的自定义规则,甚至尝试将它们推送到主存储库中。
import com.sun.jna.Native;     // Noncompliant
import sun.misc.BASE64Encoder; // Noncompliant