Создание Java интерфейсов с параметрами типа в Coldfusion - PullRequest
3 голосов
/ 16 января 2020

В моем проекте CF я работаю с AWS Java 2.0 SDK и пытаюсь реализовать асинхронную c многочастную загрузку, но у меня возникают проблемы с настройкой. в частности, при создании BiConsumer Interface.

Документов: createMultipartUpload (CreateMultipartUploadRequest createMultipartUploadRequest)

Чтобы начать этот процесс, мне нужно вызвать a3AsyncInterface.createMultipartUpload(), и поэтому я создаю CreateMultipartUploadRequest возьмите объект и передайте этот объект в мой вызов:

oCreateMultipartUploadRequest = createObject( 'java', 'software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest' ).builder()
                                .bucket( ARGUMENTS.bucket )
                                .key( ARGUMENTS.key )
                                .contentType( ARGUMENTS.fileMimeType )
                                .build();

oCreateMultipartUploadResponse = s3AsyncInterface.createMultipartUpload( oCreateMultipartUploadRequest );

Так что пока все это прекрасно работает. Мой вызов возвращает объект ответа типа CompletableFuture<CreateMultipartUploadResponse>, но здесь он начинает разваливаться.

Из CompletableFuture я хочу вызвать его .whenComplete() метод, но я не могу понять, как чтобы сделать это успешно.

Метод .whenComplete() принимает объект типа BiConsumer<? super T,? super Throwable> ( docs ), и я не могу понять, как создать этот объект. BiConsumer - это интерфейс Java, поэтому он не имеет конструктора. Я могу создать объект без проблем, но это, похоже, не обрезает его.

oBiConsumer = createObject( 'java', 'java.util.function.BiConsumer' );

Я не могу вызвать метод .accept( t, u ) для этого объекта BiConsumer, потому что я не настроил его правильно Я думаю. Это .andThen() метод, использующий другой объект BiConsumer, так что мне все еще нужно выяснить это сначала, как кажется.

Так что я думаю, что хочу сделать в Coldfusion, что-то вроде этого (пример в Java):

BiConsumer< List<Integer>, List<Integer> > equals = ( list1, list2 ) ->
{
    if ( list1.size() != list2.size() ) {
        System.out.println( 'False' );
    } else {
        for ( int i = 0; i < list1.size(); i++ ) {
            if ( list1.get( i ) != list2.get( i ) ) {
                System.out.println( 'False' );
                return;
            }
        }
        System.out.println( 'True' );
    }
};
equals.accept( lista, listb );

Не уверен, нужно ли мне даже вызывать метод .accept() правильно или как-то вызывать его, когда я передаю свои аргументы в .whenComplete(). Возможно, я все-таки ошибаюсь в этом конкретном действии c, но это нормально, я могу понять это тогда, когда доберусь туда. Я все еще хочу выяснить, как правильно настроить объект BiConsumer, это, кажется, популярный шаблон в Java, и я хочу иметь возможность работать с ним.

То, что я хотел бы иметь возможность сделать что-то вроде этого:

oBiConsumer = createObject( 'java', 'java.util.function.BiConsumer<T, U>' );

Но это, кажется, не поддерживается, и я не уверен, есть ли другой синтаксис для выполнения sh того же самого.

Я понял, что могу go в будущем создать динамический c прокси и собственный .jar для создания / построения этой функциональности, но разве это единственный путь вперед? Я бы предпочел не делать этого, если это возможно; воняет, чтобы поддерживать.

Любые предложения будут оценены.

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