CF не поддерживает конструкторы Java с переменным числом аргументов и какими-либо известными обходными путями? - PullRequest
3 голосов
/ 11 июня 2019

У нас есть проект, который работает с файлами различной кодировки.Я использую BOMInputStream , чтобы пропустить маркеры порядка байтов UTF-8.Существующий код работает, но должен также поддерживать варианты UTF-16.Наиболее простой подход - передать конструктору BOMInputStream несколько ByteOrderMarkers.

За документацию ...

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

В сигнатуре конструктора используется аргументы переменной :

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 Ответ

4 голосов
/ 11 июня 2019

Конечно, момент, когда я публикую идею, приходит ко мне Похоже, что эти переменные доступны через массив в вызываемом объекте Java. Я просто изменил код CF, чтобы передать массив спецификаций вместо отдельных аргументов, и он работал как ожидалось.

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