Ошибка в массиве ColdFusion Javacast для класса из loadPaths - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь использовать Java API Elasticsearch.

Я пытаюсь создать RestClientBuilder .

Host=createObject("java", "org.apache.http.HttpHost").init(variables.HostName, variables.Port);
Node=createObject("java", "org.elasticsearch.client.Node").init(Host);

RestClient=createObject("java", "org.elasticsearch.client.RestClient").builder(Javacast("org.elasticsearch.client.Node[]", [Node])).build();

Я получаю ошибку

Невозможно преобразовать значение в массив Java, поскольку тип org.elasticsearch.client.Node неизвестен.

Также, если я просто попытаюсь использовать:

RestClient=createObject("java", "org.elasticsearch.client.RestClient").builder(Javacast("org.apache.http.HttpHost[]", [Host]));

Iполучить следующую ошибку

Либо нет методов с указанным именем метода и типами аргументов, либо метод компоновщика перегружен типами аргументов, которые ColdFusion не может надежно расшифровать.ColdFusion обнаружил 0 методов, которые соответствуют предоставленным аргументам.Если это Java-объект, и вы убедились, что метод существует, используйте функцию javacast, чтобы уменьшить неоднозначность.

Я полагаю, это потому, что ColdFusion не очень хорошо работает с varargs

1 Ответ

0 голосов
/ 25 октября 2018

Я нашел обходной путь, используя этот метод

https://www.bennadel.com/blog/1980-tojava---a-coldfusion-user-defined-function-for-complex-java-casting.htm

Я считаю, что есть ошибка с Javacast и javaSettings loadPaths не используются.

coldfusion.runtime.Cast $ UnknownTypeException: невозможно преобразовать значение в массив Java, поскольку тип org.elasticsearch.client.Node неизвестен.at coldfusion.runtime.Cast.toJavaArray (Cast.java:1602)

Кроме того, если я пытаюсь выполнить действия, выполняемые UDF

local.javaClass = createObject("java", "org.apache.http.HttpHost");
local.HostArrayReflect = createObject("java", "java.lang.reflect.Array");
local.HostArray = local.HostArrayReflect.newInstance(
    local.javaClass.GetClass()
    , JavaCast( "int", ArrayLen(local.Hosts))
);
for (i=0; i LT ArrayLen(local.Hosts); i=i+1) {
    local.HostArrayReflect.Set(local.HostArray, JavaCast("int", i), local.Hosts[i]);
}

, я получаю сообщение об ошибке

Исключительная ситуация при создании экземпляра объекта Java.Класс не должен быть интерфейсом или абстрактным классом.Если у класса есть конструктор, который принимает аргумент, вы должны явно вызвать конструктор, используя метод init (args).Ошибка: org.apache.http.HttpHost

java.lang.NoSuchMethodException: org.apache.http.HttpHost. () В java.lang.Class.getConstructor0 (Class.java:3082) в java.lang.Class.newInstance (Class.java:412) в coldfusion.runtime.java.JavaProxy.createObjectWithDefaultConstructor (JavaProxy.java:209) в coldfusion.runtime.java.JavaProxy.invoke (JavaProxy.java:92)

1021*

Это происходит, когда я пытаюсь запустить getClass(), но в UDF проблем нет.Коллега попытался запустить это на Люси, и, похоже, это сработало, поэтому я считаю, что в CF есть ошибка, связанная с этим.

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