Java ApachePOI 3.10最终XWPFDocument.set段落()

Java ApachePOI 3.10最终XWPFDocument.set段落(),java,apache,coldfusion,apache-poi,coldfusion-9,Java,Apache,Coldfusion,Apache Poi,Coldfusion 9,我正在查看ApachePOI文档,包括下载时附带的文档和live站点上的文档。在org.apache.poi.xwpf.usermodel.XWPFDocument类中应该有一个setparagration()方法。我正在ColdFusion中使用这个类,无法访问文档中列出的许多方法 这是由于不正确地使用类还是可能的类依赖关系造成的?或者这是因为ApachePOI.jars被更新,不再支持setparagration()方法 更新: 我使用ColdFusion 9,并使用JavaLoader.c

我正在查看ApachePOI文档,包括下载时附带的文档和live站点上的文档。在
org.apache.poi.xwpf.usermodel.XWPFDocument
类中应该有一个
setparagration()
方法。我正在ColdFusion中使用这个类,无法访问文档中列出的许多方法

这是由于不正确地使用类还是可能的类依赖关系造成的?或者这是因为ApachePOI.jars被更新,不再支持
setparagration()
方法

更新:

我使用ColdFusion 9,并使用JavaLoader.cfc加载类。下面是我用来实例化操作所需的类的代码

<cfset javaLoader = server[application.myJavaLoaderKey]>
<cfset OPCPackage = javaLoader.create("org.apache.poi.openxml4j.opc.OPCPackage")>
<cfset dot_template_opc = OPCPackage.open("pathToDocxFileInstantiated")>
<cfset XWPFDocument = javaLoader.create("org.apache.poi.xwpf.usermodel.XWPFDocument")>
<cfset dot_template = XWPFDocument.init(dot_template_opc)>
<cfset XWPFParagraph = javaLoader.create("org.apache.poi.xwpf.usermodel.XWPFParagraph")>
<cfset XWPFTable = javaLoader.create("org.apache.poi.xwpf.usermodel.XWPFTable")>
<cfset XWPFRun = javaLoader.create("org.apache.poi.xwpf.usermodel.XWPFRun")>
<cfset CTP = javaLoader.create("org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP")>
<cfset CTRImpl = javaLoader.create("org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTRImpl")>
<cfset CTText = javaLoader.create("org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText")>
<cfset dot_output = "pathToNewDocxFile"><!--- Edited version of original --->
<cfset outputObject_dot = CreateObject("java","java.io.FiltOutputStream",
        "java",
        "java.io.FileOutputStream"
        ).Init(
            CreateObject(
                "java",
                "java.io.File"
                ).Init(
                    dot_output
                )>

下面是Application.cfc中与JavaLoader.cfc相关的代码。它被保存在onApplicationStart()方法中


_Thread=createObject(“java”、“java.lang.Thread”);
currentClassloader=_Thread.currentThread().getContextClassLoader();
尝试{//将当前线程的上下文类加载器设置为Javaloader的类加载器,这样dom4j就不会死_thread.currentThread().setContextClassLoader(服务器[var.JLKey].getURLClassLoader());
}
捕获(任何exc){
改头换面;
}
最后{//由于线程池,我们必须重置类加载器。
_Thread.currentThread().setContextClassLoader(currentClassloader);
}
尽管如此,我并没有删除原始的。用CF包装的罐子。我最近试图删除,但无法删除。当然,如果我再努力一点,我肯定可以删除,但我觉得这不必要

我正在调用CreateObject来实例化java.io.File和java.io.FileOutputStream。这是否以某种方式将XWPFDocument的实例化还原为CF的默认类

这是因为ApachePOI.jars正在更新并且不再支持 setparagration()方法

你能澄清一下“无法访问”吗?确切的异常和堆栈跟踪是什么

很可能恰恰相反。该方法并没有被弃用或删除,而是在比您使用的版本更新的版本中添加的。正如@Gagravarr所提到的,CF附带了旧版本的POI。您没有告诉我们您的CF版本,但CF10与POI“3.6-beta1”捆绑在一起。通常指向最新的稳定版本,目前是“3.10最终版”。显然,3.10可能包含在使用早期版本时不可用的新方法和/或类

有几种选择

  • 用新版本覆盖
    {cf_root}\lib
    中的现有POI JAR。然后重新启动CF服务器(需要)。注意:我个人没有这样做,所以我不知道这样做是否会破坏其他功能
  • 对于CF9或更早版本,请使用并行运行较新版本
  • 从CF10开始,有一个JavaLoader.cfc的裂口。因此,您可以在Application.cfc中使用来加载POI JAR的更新版本
请注意,这是一个问题,所以请记住这一点


更新1:

您是如何确定对象“没有SetParague”方法的?如果执行了
cfdump
,但没有看到列出的
setparagration()
方法,则可能没有加载该类的较新版本。您可以发布您的代码,说明如何实例化JavaLoader并创建
XWPFDocument
对象

在不知道更多的情况下,我猜可能是您意外地在某个地方使用了
createObject()
。因此,您仍然会得到该类的旧版本,而不是新版本。即:

 //this loads the older version in cf_root/lib
 createObject("java", "path.to.Class"); 

 // this loads the newer version in JavaLoader paths
 javaLoader.create("path.to.Class");
更新2:

有趣。代码正在加载旧版本,但不是出于上述原因。(见附件)

我认为问题的原因是JavaLoder path参数拼写错误:
loatPaths
而不是
loadpath
。因此它默认为空数组。结果是您实际上没有加载任何新的jar。由于
loadColdFusionClassPath=true
最终加载的是旧版本

请注意,在CF9中生成路径列表的更简单方法是使用
DirectoryList()
。该功能将允许您一次抓取所有路径。也就是说,一个非常重要的注意事项。POI使用dom4j库,该库因类加载问题而闻名。加载两个版本的jar将导致问题——即使是JavaLoader。因此,请确保首先删除
/poi/ooxml lib/dom4j-1.6.1.jar
文件。(这样也就不需要交换
currentClassloader


您的CF服务器版本是什么?IIRC,ColdFusion提供了一些相当旧的POI JAR作为标准。您是否确保正确升级POI,包括删除旧的CF提供的JAR?大家好,我目前正在运行CF9。我不是在使用JavaLoader.cfc.Leigh加载对象时删除CF supplied.jars,而是在使用JavaLoader和POI 3.10 Final。无法访问仅仅意味着对象没有setParague()方法。啊,代码正在加载旧类,但原因与我想象的不同。请看我的最新回复。太好了,非常感谢。那些讨厌的打字错误会让你每次。。。另外,感谢调试提示链接。。。我一直在找,但昨晚很累,所以我就在这里发布了。我听到了!很高兴我能帮忙。顺便说一句,从path数组中删除DOM4JJAR应该可以消除对
currentClassloader
东西的需求。
 //this loads the older version in cf_root/lib
 createObject("java", "path.to.Class"); 

 // this loads the newer version in JavaLoader paths
 javaLoader.create("path.to.Class");
  jarPaths = DirectoryList(expandPath("/poi/"), true, "path", "*.jar")