如何在 Java 中选择撒克逊 TransformerFactory

Posted

技术标签:

【中文标题】如何在 Java 中选择撒克逊 TransformerFactory【英文标题】:How to select saxon TransformerFactory in Java 【发布时间】:2011-02-27 10:22:57 【问题描述】:

在我的 Web 应用程序中,我需要使用 Saxon TransformerFactory 才能使用 XSLT 2.0,但我不能使用 setProperty 方法,因为我在 Web 服务器上没有此权限并且有一个安全管理器。

所以我读到应该可以这样做:

如果可用,请使用服务 API(如 JAR 规范中所述)来确定类名。服务 API 将在运行时可用的 jar 中的 META-INF/services/javax.xml.transform.TransformerFactory 文件中查找类名。

我在 WEB-INF/lib/saxon9.jar 中找到了这个文件,但是当我建立 TransformerFactory 时,总是选择默认工厂而不是 Saxon 工厂。

如何选择撒克逊变压器厂?

谢谢

【问题讨论】:

可以在此处找到以下(以及更多)所有方法的摘要:***.com/questions/11314604/… 【参考方案1】:

你可以尝试在你的代码中设置系统属性吗

System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");

在获取 TransformerFactory 实例之前执行此操作。

注意:这将强制 Tomcat 上的所有 webapps 使用 saxon - 因此您必须确保使用默认设置的任何其他 webapps 都可以。

【讨论】:

【参考方案2】:

如果您的应用程序确实需要 saxon 并且不能与其他处理器一起使用,那么直接使用 new net.sf.saxon.TransformerFactoryImpl() 实例化 saxon TransformerFactory 可能会很好

【讨论】:

【参考方案3】:

正确的方法是在获取新的 TransformerFactory 时指定工厂类。

我不认为调用特定的工厂实现会起作用 - 我相信默认的系统转换器可能仍会返回(至少当我在类路径中有 xalan 和 saxon 时会发生这种情况)。

示例:

TransformerFactory tFactory = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl",null);

或为撒克逊人

TransformerFactory tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null);

Javadocs:

获取一个新的实例 来自工厂类的 TransformerFactory 姓名。此功能在以下情况下很有用 有多个供应商 类路径。它提供了更多的控制权 可以指定的应用程序 应该加载哪个提供程序。一次 申请已获得 引用一个 TransformerFactory 它 可以使用工厂配置和 获取转换器实例。

【讨论】:

这适用于 Java v6 (docs.oracle.com/javase/6/docs/api/javax/xml/transform/… vs docs.oracle.com/javase/1.5.0/docs/api/javax/xml/transform/…) 这不适用于 Oracle Fusion Middleware 11.1.1.5.0 版本,因为它在其客户端 jar 文件中使用较旧的实现。【参考方案4】:

创建文件META-INF/services/javax.xml.transform.TransformerFactory,内容为:net.sf.saxon.TransformerFactoryImpl。就是这样。

【讨论】:

这对我不起作用。我使用了我的 webapp 的主 META-INF 目录。我需要使用其他的吗?

以上是关于如何在 Java 中选择撒克逊 TransformerFactory的主要内容,如果未能解决你的问题,请参考以下文章

杰克逊内部使用java序列化还是完全独立?

在 python 中使用撒克逊语

2038 年问题仍然发生在 Java 8 中日期反序列化的杰克逊身上 [重复]

xslt:撒克逊 9.4 与撒克逊 9.6 中的消息

使用杰克逊数据绑定跳过嵌套字段?

序列化对象时如何强制杰克逊将数字写为字符串