Исключение метода Java ColdFusion не найдено - PullRequest
0 голосов
/ 02 июля 2018

Эта проблема сводила меня с ума. Я пытаюсь использовать Java в ColdFusion для создания объекта Document. Когда я делаю это:

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

Я могу сбросить и найти, что он корректно загрузил все методы:

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, что я передаю ноль, он не может найти метод ..

Я пытался получить доступ к другим методам в классе - и он тоже не смог их найти ... Я не уверен, почему я могу вывести содержимое класса - и я вижу все методы ... Но, как-то CF запутывается и не может найти их, когда я пытаюсь позвонить им ..

Любые идеи будут очень полезны ..

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Я попытался получить доступ к другим методам в классе - и не смог найти их тоже .. Я не уверен, почему я могу сбросить содержимое класс - и я могу видеть все методы .. Но, так или иначе, CF получает сбит с толку и не может найти их, когда я пытаюсь позвонить им ..

tldr;

Чтобы уточнить "почему", это красная сельдь. Настоящая причина ошибки в том, что DocumentBuilder равен abstract. Вы не можете создать экземпляр абстрактного класса. Как описано в существующем ответе , вы можете создать новый экземпляр только через DocumentBuilderFactory .

подробно:

То, что фактически возвращает CreateObject, является прокси для класса java. Хотя это может выглядеть как экземпляр класса java, это не так. Это просто обертка. Заметьте, что созданный вручную прокси-объект выглядит идентично вашей переменной в cfdump?

nd = createObject("java","javax.xml.parsers.DocumentBuilder");
proxy = createObject("java", "coldfusion.runtime.java.JavaProxy").init(nd.getClass());

writeDump(var=proxy, label="This is the JavaProxy");
writeDump(var=nd, label="This is the Variable 'nd'");

Dump of Proxy Object

Относительно того, почему CF "не может найти методы", ну ... это вводит в заблуждение. Что на самом деле означает ошибка (в данном конкретном случае), так это то, что метод существует, но ... у вас еще нет доступа к нему.

Существует два соответствующих типа методов:

  • методы экземпляра : принадлежат конкретному экземпляру класса
  • статические методы : Принадлежит всему классу и может быть вызван без предварительного создания экземпляра класса

Из-за того, как работает JavaProxy, пока вы не создадите новый экземпляр с init(..), у вас есть доступ только к статическим методам. Методы в вашем дампе, такие как newInstance(), являются методами экземпляра. Поскольку ваш код не вызывает init(...), когда CF ищет доступные методы, он не находит newInstance(), и поэтому вы получаете «ошибка метода не найдена».

Вылов 22:

Конечно, если бы вы попытались создать экземпляр этого конкретного класса:

nd.init();

... это бы не получилось. Причина в том, что DocumentBuilder является абстрактным классом , поэтому вы не можете создать его экземпляр. Однако это, по крайней мере, привело бы к более точному сообщению об ошибке:

Невозможно найти конструктор для класса javax.xml.parsers.DocumentBuilder, который принимает параметры типа ('').

Короче говоря, сообщение об ошибке вводит в заблуждение. Метод действительно есть, он просто не был доступен, потому что у вас не было надлежащего «экземпляра» класса. Как объясняет существующий ответ , единственный способ получить правильный экземпляр - через DocumentBuilderFactory .

0 голосов
/ 02 июля 2018

Вы должны создать объект для фабрики documentBuilder. С помощью фабрики вы можете получить реальную информацию XML. Здесь я создал объект и вызвал метод parse с помощью documentbuilderfactory. Также вы должны внедрить 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>

Я надеюсь, это поможет вам. Благодарю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...