ColdFusion Java 方法未找到异常



这个问题一直让我发疯。我正在尝试在 ColdFusion 中使用 Java 来创建 Document 对象。当我这样做时:

nd = createObject("java","javax.xml.parsers.DocumentBuilder");

我可以转储 nd 并看到它是否正确加载了所有方法:

object of javax.xml.parsers.DocumentBuilder Class Name javax.xml.parsers.DocumentBuilder 
Method / Return Type
getDOMImplementation() / org.w3c.dom.DOMImplementation
getSchema() / javax.xml.validation.Schema 
isNamespaceAware() / boolean 
isValidating() / boolean 
isXIncludeAware() / boolean 
newDocument() / org.w3c.dom.Document 
parse(java.io.File) / org.w3c.dom.Document 
parse(java.lang.String) / org.w3c.dom.Document 
parse(org.xml.sax.InputSource) / org.w3c.dom.Document 
parse(java.io.InputStream, java.lang.String) / org.w3c.dom.Document 
parse(java.io.InputStream) / org.w3c.dom.Document 
reset() / void 
setEntityResolver(org.xml.sax.EntityResolver) / void 
setErrorHandler(org.xml.sax.ErrorHandler) / void 

我正在尝试调用 newDocument(( 方法。我已经在 cfscript 和 cfset 中尝试了以下所有方法:

nd.newDocument();
nd.newDocument(JavaCast("null",""));
nd = createObject("java","javax.xml.parsers.DocumentBuilder").newDocument();
nd = createObject("java","javax.xml.parsers.DocumentBuilder").newDocument(JavaCast("null",""));

但是,无论我尝试哪种方法,我都会收到此错误:

要么没有具有指定方法名称和参数类型的方法 或者 isNamespaceAware 方法重载了以下参数类型 ColdFusion无法可靠地破译。ColdFusion 找到了 0 个与提供的参数>匹配的方法。如果这是一个 Java 对象,并且您验证了该方法>存在,请使用 javacast 函数来减少歧义。

我可以看到该方法已加载。.该方法未重载。它不需要任何参数。而且,即使我明确告诉 CF 我正在传递 null,它也找不到该方法。

我尝试访问类中的其他方法 - 它也找不到这些方法。我不确定为什么我可以转储类的内容 - 我可以看到所有方法。但是,不知何故,CF变得困惑,当我尝试打电话给他们时找不到它们。

任何想法都会超级有帮助。

谢谢!!

您必须为 documentBuilder 工厂创建一个对象。在工厂的帮助下,您可以获得实现的xml信息。在这里,我创建了对象并使用文档生成器工厂调用 parse 方法。 此外,您必须注入一个新实例((,然后只有您可以访问newdocument((方法。我的XML内容:测试解析.xml

<?xml version="1.0"?>
<company>
<staff id="1001">
<firstname>yong</firstname>
<lastname>mook kim</lastname>
<nickname>mkyong</nickname>
<salary>100000</salary>
</staff>
<staff id="2001">
<firstname>low</firstname>
<lastname>yin fong</lastname>
<nickname>fong fong</nickname>
<salary>200000</salary>
</staff>
</company>

*CF 代码 :

<cfset myObj = createObject("java","javax.xml.parsers.DocumentBuilderFactory")>
<cfset createDocs = myObj.newInstance().newDocumentBuilder()>
<cfset parseDocs = createDocs.parse(expandpath('/testParse.xml'))>
<cfset getNodeName = parseDocs.getDocumentElement().getNodeName()>
<cfset getList = parseDocs.getElementsByTagName("staff")>
<cfloop index="i" from="1" to="#getList.getlength()#">
<!--- Do your business logic here  --->
</cfloop>

我希望它能对你有所帮助。谢谢。

我在java类上从ColdFusion调用方法时遇到了相同的错误。我试图使用setPropertyName方法,如下所示。

<cfobject action="create" type="java" name="This.txnRequest" class="#AnetAPI#.TransactionRequestType" />
<cfset authTxnType=CreateObject("java", "#AnetAPI#.TransactionTypeEnum") />
<cfset This.txnRequest.setTransactionType(authTxnType.AUTH_CAPTURE_TRANSACTION) />

事实证明,ColdFusion 希望您直接访问 EJB 中的属性。您还需要像这样显式调用 EJB 构造函数:

<cfset This.txnRequest.init() />
<cfset This.txnRequest.TransactionType=authTxnType.AUTH_CAPTURE_TRANSACTION />

CF 会为您隐式调用 set 方法,如 Adobe Docs 中所述。您不能直接调用它。

相关内容

最新更新