Как подключить пользовательский интерфейс Vaadin к сервису Amazon S3 весной?

Я создаю веб-интерфейс с помощью Vaadin, который отображает список объектов, которые есть в моем корзине Amazon S3, в компоненте Vaadin Grid. Моя служба работает нормально, но я получаю исключение NullPointerException каждый раз, когда пытаюсь добавить список объектов из моей службы S3 в сетку.

Вот сервис S3: Сервис S3

Я протестировал свой сервис, используя интерфейс Spring CommandLineRunner в тестовом классе. Вот тестовый класс: Тестовый класс

Всякий раз, когда я запускаю приложение, я вижу список элементов в моем сегменте S3, указанный на консоли: Вывод на консоль

Но та же служба выдает исключение NullPointerException в браузере всякий раз, когда я пытаюсь добавить элементы списка в сетку Vaadin, и исключение BeanCreationException регистрируется на консоли:

BeanCreationExceptionNullPointerException

Вот S3Service.java

@Service
public class S3Service {
    @Autowired
    private AmazonS3 s3Client;
    @Value("${aws.s3.bucket.name}")
    private String bucketName;
    public List<String> listObjects() {
        ObjectListing objectListing=s3Client.listObjects(bucketName);
        return objectListing.getObjectSummaries()
                .stream()
                .map(S3ObjectSummary::getKey)
                .collect(Collectors.toList());
    }
}

TestFeatureClass.java

@Component
public class TestFeatureClass implements CommandLineRunner {
    @Autowired
    private S3Service s3Service;
    @Override
    public void run(String... args) throws Exception {
        System.out.println(s3Service.listObjects());
    }
}

DocumentManagementSystemView.java

@PageTitle("Documents")
@Route(value = "api/v1/files/list",layout = MainLayout.class)
@Uses(Icon.class)
public class DocumentManagementSystemView extends VerticalLayout {
    @Autowired
    public S3Service s3Service;
    Grid<String> grid;
    public DocumentManagementSystemView() {

        this.grid=new Grid<>(String.class,false);
        configureGrid();

        add(grid);
        updateList();

    }
    private void configureGrid() {
        grid.setColumns("Filename");
    }
    private void updateList() {
        grid.setItems(s3Service.listObjects());
    }
}

Понял. Буду иметь это в виду в следующий раз.

CodeX 05.04.2024 10:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первая проблема, которую я вижу, заключается в том, что вам следует использовать внедрение в конструктор вместо внедрения в поле, если вы собираетесь использовать внедренный компонент во время конструктора. Это должно исправить ваше исключение NullPointerException.

@PageTitle("Documents")
@Route(value = "api/v1/files/list",layout = MainLayout.class)
@Uses(Icon.class)
public class DocumentManagementSystemView extends VerticalLayout {
    
    private S3Service s3Service;
    private Grid<String> grid;
    
    public DocumentManagementSystemView(S3Service s3Service) {
        this.s3Service = s3Service;
        ...
    }
}

Вторая проблема, которую я вижу, заключается в том, что вы используете grid.setColumns("Filename") в сетке типа String. При этом будет предпринята попытка найти свойство под названием «Имя файла» в классе String и отобразить его в столбце. Я предполагаю, что вам нужен столбец с заголовком «Имя файла». Поскольку Grid имеет тип String, и вы хотите отобразить эту строку в этом столбце, вам следует предоставить поставщик значений, который возвращает весь элемент/строку: str -> str или Function.identity(), по сути, это одно и то же, вы выбираете, что вам более удобочитаемо. . подробнее

grid.addColumn(str -> str).setHeader("Filename");

Другие вопросы по теме