【问题标题】:ColdFusion Java Method Not Found Exception未找到 ColdFusion Java 方法异常
【发布时间】:2018-07-02 14:45:43
【问题描述】:

这个问题一直让我发疯。我正在尝试在 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 和 cfsets 中都尝试了以下所有方法:

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 很困惑,找不到他们..

任何想法都会非常有帮助..

谢谢!!

【问题讨论】:

    标签: java coldfusion


    【解决方案1】:

    您必须为 documentBuilder 工厂创建一个对象。在工厂的帮助下,您可以获得相关的 xml 信息。在这里,我创建了对象并使用 documentbuilderfactory 调用了 parse 方法。 你也必须注入一个 newInstance() 然后只有你可以访问 newdocument() 方法。 我的 XML 内容:testParse.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>
    

    希望对你有帮助。谢谢。

    【讨论】:

    【解决方案2】:

    我在 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 中所述。不能直接调用。

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 2015-06-29
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多