Error in ColdFusion Javacast array to class from loadPaths

狂风中的少年 提交于 2019-12-24 05:51:29

问题


I am trying to use Elasticsearch's Java API.

I am trying to create a 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();

I get the error

Cannot convert the value to Java array because type org.elasticsearch.client.Node is unknown.

Also if I just try to use:

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

I get the following error

Either there are no methods with the specified method name and argument types or the builder method is overloaded with argument types that ColdFusion cannot decipher reliably. ColdFusion found 0 methods that match the provided arguments. If this is a Java object and you verified that the method exists, use the javacast function to reduce ambiguity.

This I assume is because ColdFusion doesn't play nicely with varargs


回答1:


I found a workaround using this method

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

I believe there is a bug with Javacast and javaSettings loadPaths not being used.

coldfusion.runtime.Cast$UnknownTypeException: Cannot convert the value to Java array because type org.elasticsearch.client.Node is unknown. at coldfusion.runtime.Cast.toJavaArray(Cast.java:1602)

Additionally if I try to perform the actiuons that the UDF takes

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]);
}

I get the error

An exception occurred while instantiating a Java object. The class must not be an interface or an abstract class. If the class has a constructor that accepts an argument, you must call the constructor explicitly using the init(args) method. Error : org.apache.http.HttpHost

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

This happens when I try to run getClass(), but in the UDF there is no issue. A coworker tried to run this on Lucee and it seems to have worked, so I believe there is a bug in CF related to this.



来源:https://stackoverflow.com/questions/52996435/error-in-coldfusion-javacast-array-to-class-from-loadpaths

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!