CF是否不支持带有可变数量的参数和任何已知解决方法的Java构造函数?

时间:2019-06-11 15:33:34

标签: coldfusion coldfusion-2016 apache-commons-io

我们有一个处理各种编码文件的项目。我正在使用BOMInputStream跳过UTF-8字节顺序标记。现有代码可以使用,但还需要支持UTF-16变体。最直接的方法是向BOMInputStream构造函数传递多个ByteOrderMarkers。

每个文档...

BOMInputStream bomIn = new BOMInputStream(in,
                               ByteOrderMark.UTF_16LE,
                               ByteOrderMark.UTF_16BE,
                               ByteOrderMark.UTF_32LE,
                               ByteOrderMark.UTF_32BE);

构造函数签名使用variable arguments

public BOMInputStream(InputStream delegate,
          ByteOrderMark... boms)

但是,当我尝试使用以下代码调用此构造函数时

<cfset var fis = createObject("java", "java.io.FileInputStream").init(arguments.filePath) />
<cfset var boms = createObject("java", "org.apache.commons.io.ByteOrderMark") />
<cfset var bomins = createObject("java", "org.apache.commons.io.input.BOMInputStream").init(fis, boms.UTF_8, boms.UTF_16LE, boms.UTF_16BE) />

我收到以下错误信息...

Unable to find a constructor for class org.apache.commons.io.input.BOMInputStream that accepts parameters of type ( java.io.FileInputStream, org.apache.commons.io.ByteOrderMark, org.apache.commons.io.ByteOrderMark, org.apache.commons.io.ByteOrderMark ).

我也只尝试了一个BOM参数,并在错误中使用较少的参数而得到相同的错误。因此,看来CF不能调用带有无限参数的Java构造函数。那是正确的吗?如果是,是否有已知的解决方法?

1 个答案:

答案 0 :(得分:4)

当然,当我发布一个想法的时候。看起来这些变量是通过被调用的Java对象中的数组访问的。我只是更改了CF代码以传递BOM表数组,而不是传递单个参数,它按预期工作。

<cfset var bomins = createObject("java", "org.apache.commons.io.input.BOMInputStream").init(
    fis, 
    [boms.UTF_8, boms.UTF_16LE, boms.UTF_16BE]
) />